我对来自 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 ,它“神奇地”给了我预期的结果,但我也有一些聚合(不在这个例子中),所以它不是一个选项。