我在弹性搜索中具有以下数据:
[
{
"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的记录。但是实际上,我会获得多条记录。
我在这里做错了什么?任何帮助将不胜感激!
答案 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
}
}
}
}
}