【问题标题】:Combining query and filter on same field in elastic search在弹性搜索中结合查询和过滤同一字段
【发布时间】:2014-12-11 16:40:30
【问题描述】:

我有地址文档类型,其中城市作为字段。城市字段使用分析仪

"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。我怎样才能把它结合起来?

【问题讨论】:

    标签: elasticsearch lucene


    【解决方案1】:

    Elasticsearch 允许将查询与布尔查询结合起来。布尔查询有三个字段:

    • 必须 (AND)
    • 应该(或)
    • must_not(与非)

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

    • 第一个选择包含至少一个标记 == "myCity" 的城市字段的项目
    • 第二个选择没有城市字段的项目

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

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

    一些有用的资源:

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 2015-01-25
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多