【问题标题】:ElasticSearch 5.x should query vs filteringElasticSearch 5.x 应该查询与过滤
【发布时间】:2017-01-18 21:36:31
【问题描述】:

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

【问题讨论】:

  • 在您的情况下,模块过滤器是“必须”的,但 should 子句是可选的。然后你会得到所有具有模块 9 或 5 的文档,如果一个文档满足任何should 子句,它的排名就更高
  • 是的,我就是这么想的。我有一个“解决方案”,给查询一个 must_not,以及用户无法访问的所有 ModuleId。但是……来吧。我不敢相信这是一种有意的行为,以缩小 ES 中的结果集。

标签: elasticsearch booleanquery


【解决方案1】:
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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多