弹性搜索-如何组合filter和should子句?

时间:2018-11-30 06:47:00

标签: elasticsearch

我在弹性搜索中具有以下数据:

[
{
  "firstName": "John",
  "lastName": "Doe",
  "id": 10
},
{
  "firstName": "Mary",
  "lastName": "Jane",
  "id": 10
},
{
  "firstName": "John",
  "lastName": "Lennon",
  "id": 12
}
]

我想编写一个弹性搜索查询,该查询可以匹配firstName或lastName(应该),然后使用ID过滤这些结果。

我编写的当前查询如下:

{
  "query": {
    "bool": {
      "filter": [{
        "term": {
          "id": 10
        }
      }],
      "should": [{
        "match": {
            "firstName": "john"
        }
      }, {
        "match": {
            "lastName": "john"
        }
      }]
    }
  }
}   

据我了解,当我执行上述查询时,我应该只获得firstName为“ John”且id为10的记录。但是实际上,我会获得多条记录。

我在这里做错了什么?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

按照@Val更新我的答案,您只需要添加minimum_should_match子句,下面就是您要寻找的内容:

POST <your_index_name>/_search
{
  "query": {
    "bool" : {
      "filter": {
        "term" : { "id" : "10" }
      },
      "should" : [
        { "match" : { "firstName" : "john" } },
        { "match" : { "lastName" : "john" } }
      ],
      "minimum_should_match": 1
    }
  }
}

让我知道是否有帮助!

答案 1 :(得分:0)

Kamal接受的答案无疑是解决此问题的更好,更优雅的方法。 但是,另一种选择可以通过执行以下操作:

{
   "query":{
      "bool":{
         "must":{
                    "bool": {
                        "should": [
                            {"match": {"firstName": "john"}},
                            {"match": {"lastName": "john"}}
                        ]
                    }
                },
         "filter":{
            "term":{
               "id":10
            }
         }
      }
   }
}