美文网首页Elastic...
记一次ElasticSearch(ES)的复杂搜索。

记一次ElasticSearch(ES)的复杂搜索。

作者: 青山淼淼 | 来源:发表于2020-10-16 21:06 被阅读0次

记一次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_id283

这个是错误的!!!!

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
        }
      }
    ]
  }
}

相关文章

网友评论

    本文标题:记一次ElasticSearch(ES)的复杂搜索。

    本文链接:https://www.haomeiwen.com/subject/kgetmktx.html