ElasticSearch排除满足条件的结果

时间:2019-04-09 14:01:44

标签: elasticsearch elasticsearch-5

我想排除某些结果被满足条件的geo_distance过滤掉。

例如,我按地理距离过滤结果,但我想包括状态异常且满足match_phrase查询(即使它不在geo_distance之外)的所有结果

        GET /drive/_search
        {
          "query": {
            "bool": {
              "should": [
                {
                  "match_phrase": {
                    "keywords": "wheels"
                  }
                },
                {
                  "match_phrase": {
                    "name": "car sale"
                  }
                }
              ],
              "filter": [
                {
                  "term": {
                    "status": "normal"
                  }
                },
                {
                  "geo_distance": {
                    "distance": "0.09km",
                    "address.coordinate": {
                      "lat": -33.703082,
                      "lon": 18.981069
                    }
                  }
                }
              ]
            }
          }
        }

我一直在阅读文档并进行谷歌搜索,但我认为我可能走错了方向。

如果您能为我指明正确的方向,或者向我解释这样做会是一个更好的解决方案,那么我将不胜感激。

1 个答案:

答案 0 :(得分:1)

来自doc

  

应该

     

子句(查询)应出现在匹配的文档中。如果布尔   查询位于查询上下文中,并且具有must或filter子句,然后   即使没有应该查询的文档也将匹配布尔查询   比赛。在这种情况下,这些条款仅用于影响   得分了。如果布尔查询在过滤器上下文中,或者既不必须,也不   过滤,则至少应有一个查询必须与文档匹配   使其与布尔查询匹配。此行为可能是明确的   通过设置minimum_should_match参数进行控制。

因此,在您的情况下,地理位置条件位于“ ”中,因为它可以是可选的,其余条件位于“ 过滤器”中”为必填项:状态和match_phrase

尝试一下:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "status": "normal"
          }
        },
        {
          "match_phrase": {
            "name": "car sale"
          }
        },

        {
          "match_phrase": {
            "keywords": "wheels"
          }
        }
      ],
      "should": [
        {
          "geo_distance": {
            "distance": "0.09km",
            "address.coordinate": {
              "lat": -33.703082,
              "lon": 18.981069
            }
          }
        }
      ]
    }
  }
}