elasticsearch,Php,elasticsearch" /> elasticsearch,Php,elasticsearch" />

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中存储文档。