簡體   English   中英

ElasticSearch 5.x應該查詢還是過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM