在弹性搜索中将查询和过滤器结合在同一个字段上

时间:2014-12-11 07:06:53

标签: elasticsearch lucene

我有地址的doc类型,其中city为field。城市领域使用分析器

"keyword_analyzer": {
  "tokenizer": "keyword", # So that we don't split multi word city name
  "filter": ["lowercase"] # The search needs to case insensitive
}

如何获得与赠送城市“X”或城市匹配的任何地址为空。在sql中它将被写为

SELECT * FROM address
WHERE city = 'X' or city IS NULL

我想我必须使用匹配查询来获取city ='X'和'缺失'过滤器才能获得city IS NULL。我该如何结合这个?

1 个答案:

答案 0 :(得分:3)

Elasticsearch允许将查询与bool查询组合在一起。 Bool查询有三个字段:

  • 必须(AND)
  • (OR)
  • must_not (AND NOT)

以下elasticsearch查询是一个包含should字段的布尔查询,包含两个子查询:

  • 第一个选择包含至少一个令牌的城市字段的项目==“myCity”
  • 第二个选择没有城市字段的项目

此查询的结果将等同于city = 'mycity' OR city IS NULL

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "city": "mycity"
          }
        },
        {
          "filtered": {
            "query": {
              "match_all": {}
            },
            "filter": {
              "missing": {
                "field": "city"
              }
            }
          }
        }
      ]
    }
  }
}

一些有用的资源: