2017-01-17 77 views
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,它「神奇地」給了我預期的結果,但我也有一些聚合(不是在這個例子中),所以它不是一個選項。

+0

模塊過濾器是'必須'在你的情況下,但'應該'子句是可選的。然後你得到所有有9或5模塊的文檔,如果一個文檔符合任何'應該'條款的排名更高 –

+0

是的,這就是我的想法。我有一個「解決方案」,給查詢一個must_not,以及用戶無法訪問的所有ModuleId。但是......來吧。我不能相信這是一種預期的行爲,要縮小ES中的結果集。 –

回答

2
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 
     } 
    } 
}