ElasticSearch 5.x应该查询和过滤

时间:2017-01-17 15:08:14

标签: elasticsearch booleanquery

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

String s = getIntent().getStringExtra("Edit Text data");

我想要的是:获取其名称,描述或文本与查询或所有项目(它是映射中的_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"}}
                    ]
                }
            }
            ]
        }
    }
}

繁荣!在结果中,我得到所有,其匹配上述查询所有具有ModuleId 9或5的项目。我想要的是缩小结果范围而不是扩大它们。我尝试了很多与should,must,filter(bool过滤器)的组合。我也尝试了post_filter,它“神奇地”给了我预期的结果,但我也有一些聚合(不是在这个例子中),所以它不是一个选项。

1 个答案:

答案 0 :(得分: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
        }
    }
}