[英]ElasticSearch 5.x should query vs filtering
我對來自ES查詢的結果有疑問。 篩選查詢會產生一些令人困惑的結果,但我不知道該如何克服。 所以:
{
"query":{
"bool":{
"should":[
{
"multi_match":
{
"query":"searchquery",
"operator":"and",
"fields":["Name", "Description", "Text"]
}
},
{
"bool":{
"must": [
{"terms": {"Id": [1, 2]}},
{"term": {"_type": "Project"}}
]
}
}
]
}
}
}
我要在這里得到的是:獲取名稱,描述或文本與查詢匹配的所有記錄,或ID為1或2的所有項目(在映射中為_type)。結果完全符合我的預期,我得到了例如:5個匹配項,2個Contact _type,1個與“ searchquery”匹配的項目以及2個ID為1或2的項目。
但我有一定的授權,因此並非所有用戶都可以訪問所有模塊(項目具有另一個字段,例如:ModuleId)。
所以我想將結果限制為特定的ModuleIds:
{
"query":{
"bool":{
"should":[
{
"multi_match":
{
"query":"searchquery",
"operator":"and",
"fields":["Name", "Description", "Text"]
}
},
{
"bool":{
"must": [
{"terms": {"Id": [1, 2]}},
{"term": {"_type": "Project"}}
]
}
}
],
"filter": [
{"terms": {"ModuleId": [9, 5]}}
]
}
}
}
和繁榮! 在結果中,我得到了all ,它們與上面的查詢相匹配, 並且與ModuleId為9或5的所有Projects匹配。我想要的是縮小結果范圍而不是擴大范圍。 我試過了許多與should,must,filter(布爾過濾器)的組合。 我也嘗試過post_filter,它“神奇地”給了我預期的結果,但是我也有一些聚合(在這個例子中沒有),所以這不是一個選擇。
minimum_should_match: 1
外布爾查詢中的工作做得很好,並且就像一個魅力。
{
"query":{
"bool":{
"should":[
{
"multi_match":
{
"query":"searchquery",
"operator":"and",
"fields":["Name", "Description", "Text"]
}
},
{
"bool":{
"must": [
{"terms": {"Id": [1, 2]}},
{"term": {"_type": "Project"}}
]
}
}
],
"filter": [
{"terms": {"ModuleId": [9, 5]}}
],
"minimum_should_match": 1
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.