针对字段的Elasticsearch匹配列表

Dio*_*lor 11 elasticsearch

我有一个列表,数组或您熟悉的任何语言.例如名称:["John","Bas","Peter"]我想查询该name字段是否与其中一个名称相匹配.

一种方法是使用OR Filter.例如

{
    "filtered" : {
        "query" : {
            "match_all": {}
        },
        "filter" : {
            "or" : [
                {
                    "term" : { "name" : "John" }
                },
                {
                    "term" : { "name" : "Bas" }
                },
                {
                    "term" : { "name" : "Peter" }
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何更高级的方式?如果它是一个查询而不是过滤器,那就更好了.

小智 18

当我尝试filtered我得到的查询时no [query] registered for [filtered],根据这里的答案,似乎过滤查询已在 ES 5.0 中被弃用并删除。所以我提供使用:

{
    "query": {
        "bool": {
            "filter": {
                "terms": {
                    "name": ["John","Bas","Peter"]
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


knu*_*ker 17

{
  "query": {
    "filtered" : {
      "filter" : {
        "terms": {
          "name": ["John","Bas","Peter"]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

哪个Elasticsearch重写,好像你使用了这个

{
  "query": {
    "filtered" : {
      "filter" : {
        "bool": {
          "should": [
            {
              "term": {
                "name": "John"
              }
            },
            {
              "term": {
                "name": "Bas"
              }
            },
            {
              "term": {
                "name": "Peter"
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用布尔过滤器时,大多数情况下,使用bool过滤器比使用and或更好or.原因在Elasticsearch博客上解释:http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

  • `filtered` 现已弃用,请参阅 Erfan 的回答 (2认同)