1
我遇到來自ES查詢的結果問題。過濾查詢會產生一些令人困惑的結果,我不知道如何克服它。 所以:ElasticSearch 5.x應該查詢vs過濾
{
"query":{
"bool":{
"should":[
{
"multi_match":
{
"query":"searchquery",
"operator":"and",
"fields":["Name", "Description", "Text"]
}
},
{
"bool":{
"must": [
{"terms": {"Id": [1, 2]}},
{"term": {"_type": "Project"}}
]
}
}
]
}
}
}
我想這裏是:獲得其名稱,或說明,或文本是匹配的查詢或所有項目(這是在映射_type),其ID爲1或2的所有記錄。 結果看起來正是我所期望的,例如:5次點擊,2次聯繫_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]}}
]
}
}
}
呯!在結果中,我得到了全部,它們與上述查詢和匹配所有包含ModuleId 9或5的項目。我想要的是縮小結果而不擴大它們。我已經嘗試了很多與should,must組合的過濾器(bool過濾器)。我也試過post_filter,它「神奇地」給了我預期的結果,但我也有一些聚合(不是在這個例子中),所以它不是一個選項。
模塊過濾器是'必須'在你的情況下,但'應該'子句是可選的。然後你得到所有有9或5模塊的文檔,如果一個文檔符合任何'應該'條款的排名更高 –
是的,這就是我的想法。我有一個「解決方案」,給查詢一個must_not,以及用戶無法訪問的所有ModuleId。但是......來吧。我不能相信這是一種預期的行爲,要縮小ES中的結果集。 –