记一次ElasticSearch
(ES)的复杂搜索。
ElasticSeach
多条件查询
- 因为业务需求,需要对同一个字段多条件查询。其中有个条件就是
return_admin_id
不等于当前账号且return_admin_id
必须为真。
开始错误的思路就是:查询 return_admin_id > 0 AND return_admin_id < ? AND return_admin_id > ?
,这样的结果就是这语句本身就会有冲突,根本查询不到结果。
其实正确的思路应该是:查询return_admin_id > 0 AND ( return_admin_id < ? OR return_admin_id > ? )
,开始也是被自己蠢哭了。
在ElasticSearch
的查看Kibana
中执行的语句为以下:假设return_admin_id
为 283
这个是错误的!!!!
GET index/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"return_admin_id": {
"gt": 0
}
}
},
{
"range": {
"return_admin_id": {
"gt": 283
}
}
},
{
"range": {
"return_admin_id": {
"lt": 283
}
}
}
]
}
}
}
这样才是对的
GET index/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"return_admin_id": {
"gt": 0
}
}
}
],
"must_not": [
{
"term": {
"return_admin_id": {
"value": "283"
}
}
}
]
}
}
}
比如现在想查询add_num < 2
AND occupation
包含 56
AND province_id = 17 AND (province_id <> 6 AND (add_num = 2 OR occupation 包含 18,199 其中一个 OR info_id = 2))
GET index/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"add_num": {
"lt": 2
}
}
},
{
"terms": {
"occupation": [
"56"
]
}
},
{
"term": {
"province_id": {
"value": "17"
}
}
},
{
"bool": {
"must_not": [
{
"term": {
"province_id": 6
}
}
],
"should": [
{
"term": {
"add_num": {
"value": "2"
}
}
},
{
"terms": {
"occupation": [
"18",
"99"
]
}
},
{
"bool": {
"must": [
{
"term": {
"info_id": {
"value": "2"
}
}
}
]
}
}
],
"minimum_should_match": 1
}
}
]
}
}
}
查询结果如下 :
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 4.0,
"hits" : [
{
"_index" : "index",
"_type" : "_doc",
"_id" : "13870381996",
"_score" : 4.0,
"_source" : {
"note" : "",
"handle_time" : 1601606975,
"occupation" : [
"18",
"56",
"36"
],
"add_num" : 1,
"is_sms" : 0,
"province_id" : 17,
"user_id" : 0,
"admin_id" : 0,
"info_id" : 6789007,
"is_batch_sms" : 0,
"tel" : "13870381996",
"time" : 1601095805,
"status" : 1,
"city_id" : 240
}
}
]
}
}