我正在尝试创建一些报表过滤器,用户可以在其中使用报表上的任何字段搜索配置文件。例如:搜索任何以ann
开头的具有firstname
和以vi
开头的grade
的配置文件。
以下是我迄今为止写的一个查询:
{
from: 20,
size: 20,
query: {
filtered: {
query: {
match_all: [ ]
},
filter: {
bool: {
must: [
{
prefix: {
firstname: "ann"
}
},
{
prefix: {
grade: "vi"
}
}
]
}
}
}
},
sort: {
grade: {
order: "asc"
}
}
}
如果我删除must
的一个子项(在bool
过滤器中),它就起作用了。但一旦我使用了多个过滤器,它就不会返回任何结果,而且我需要能够使用其中的任何数量的条目。
此外,如果我使用should
而不是must
,它也可以工作。我不确定我是否误解了逻辑,但据我所知(在这种情况下)must
应该只返回以ann
开头的firstname
和以vi
开头的grade
的结果。
它们确实存在,但是这个查询就是找不到它们。
我是不是遗漏了什么?
感谢
因为,我还不能发表评论。我用一些假设来回答。
首先,我使用的是ES 0.90.2 version
,您的查询对我的输入很好。然而,根据您的输入大小和执行查询的平台,我的答案可能不正确。
假设:索引中的数据数量小于20。
我在索引中添加了以下输入:
'{"name": "ann", "grade": "vi"}'
'{"name": "ann", "grade": "ii"}'
'{"name": "johan", "grade": "vi"}'
'{"name": "johan", "grade": "ii"}'
我的测试查询与您的相同,结果如下:
"hits" : {
"total" : 2,
"max_score" : null,
"hits" : [ ] // <-- see this part is blank
}
正如你所看到的,它没有列出命中率,但有两个命中率。这是因为from:20
代码段。如果您更改该值,您可以看到一些结果。如果您想查看所有结果,只需删除该部分即可。
注意:如果不是这样的话,很抱歉打扰您:(