1

我对来自 ES 查询的结果有疑问。过滤查询会产生一些令人困惑的结果,我不知道如何克服它。所以:

{
    "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 个联系人类型、1 个项目匹配“searchquery”以及 2 个 ID 为 1 或 2 的项目。好!

但我有一些授权,所以并非所有用户都访问所有模块(项目有另一个字段,例如:ModuleId)。

所以我想将结果限制为特定的 ModuleId:

{
    "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,其与上述查询匹配,并且所有 Projects 的 ModuleId 为 9 或 5。我想要的是缩小结果而不是扩大它们。我已经尝试了很多应该、必须、过滤器(以及布尔过滤器)的组合。我也尝试过 post_filter ,它“神奇地”给了我预期的结果,但我也有一些聚合(不在这个例子中),所以它不是一个选项。

4

1 回答 1

2
minimum_should_match: 1

在外部 bool 查询中做得很好,并且像魅力一样工作。

{
    "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
        }
    }
}
于 2017-01-18T13:36:31.693 回答