【发布时间】: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