Php Elasticsearch-使用Bool(MUST&;AND)DSL查询创建报告过滤器
我正在尝试创建一些报告过滤器,用户可以在其中使用报告上的任何字段搜索配置文件。例如:搜索以Php Elasticsearch-使用Bool(MUST&;AND)DSL查询创建报告过滤器,php,elasticsearch,Php,elasticsearch,我正在尝试创建一些报告过滤器,用户可以在其中使用报告上的任何字段搜索配置文件。例如:搜索以ann开头的firstname和以vi开头的grade的任何档案 到目前为止,我写了一个问题: { from: 20, size: 20, query: { filtered: { query: { match_all: [ ] }, filter: {
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
过滤器中)的一个子项,它会工作。但是,一旦我使用了多个过滤器,并且我需要能够在其中使用任意数量的条目,它就不会返回任何结果
此外,如果我使用应该
而不是必须
,它也可以工作。我不确定我是否误解了逻辑,但据我的理解(在本例中)必须
只返回以ann
开头的名字
和以vi
开头的等级
它们确实存在,但此查询无法找到它们
我是不是遗漏了什么
谢谢,因为我还不能发表评论。我用一些假设来回答 首先,我使用的是
es0.90.2版本
,您的查询对我的输入很有效。但是,根据您的输入大小和执行查询的平台,我的答案可能不正确
假设:索引中的数据数量少于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
}
“点击次数”:{
“总数”:2,
“最大分数”:空,
“点击次数”:[]//查询看起来很好,您对它应该如何工作的理解是正确的。因此,它可能与您的映射或字段名有关,或者您认为设置正确但不正确的其他内容有关。请尝试创建一个使用示例文档和查询的最小示例。一个空索引和两个curl命令就可以了确认您的查询没有问题。您好,谢谢,但我在没有分页的情况下进行了测试,没有得到任何结果。我还使用命令行上的Curl进行了测试,但没有成功。我仍然得到'total':0
。您的索引设置(分析器和映射)是什么?我使用了默认的_分析器,这可能是问题所在。我发现了问题。这次我真的是个傻瓜:我一直在尝试用不同的模式检索记录。记录a有字段firstname
,但没有字段grade
。记录B有grade
,但没有firstname
。我非常高兴我是如何尝试聚合的。这意味着我可能必须使用应该,然后以某种方式将记录组合在代码中,这是一个完全不同的问题。对吗?我猜这不可能仅在ElastSearch中实现?您的索引中有多少文档?如果没有那么多,您可以删除所有数据并重新为您编制索引r数据或不删除覆盖它与版本控制功能,但你仍然必须删除一些虚拟数据。除此之外,我不知道另一种解决方案,你可以合并这些文件。谢谢Shyos。只是这些文件是由Couchbase自动索引的,所以我有点无法控制他们的模式,除非我改变我的方式在Couchbase中存储文档。