【问题标题】:Elasticsearch - Create report filters using Bool (MUST & AND) DSL queryElasticsearch - 使用 Bool (MUST & AND) DSL 查询创建报告过滤器
【发布时间】:2013-07-26 19:35:30
【问题描述】:

我正在尝试创建一些报告过滤器,用户可以在其中使用报告上的任何字段搜索配置文件。例如:搜索任何以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 应该只返回以firstname 开头的结果,anngradevi 开头。

它们确实存在,但是这个查询没有找到它们。

我在这里遗漏了什么吗?

谢谢

【问题讨论】:

  • 查询看起来很好,您对它应该如何工作的理解是正确的。因此,这可能与您的映射或字段名有关,或者您认为设置正确但未正确设置的其他内容。尝试使用示例文档和查询创建一个中断的最小示例。一个空索引和两个 curl 命令应该可以确认您的查询没有问题。

标签: php elasticsearch


【解决方案1】:

因为,我还不能发布 cmets。我用一些假设来回答。

首先,我使用的是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 代码段。如果您更改该值,您可以看到一些结果。如果您想查看所有结果,只需删除该部分即可。

注意:如果不是这样,抱歉打扰:(

【讨论】:

  • 您好,谢谢,但是我没有分页测试,没有得到任何结果。我也在命令行上使用 Curl 尝试过,但没有运气。我仍然收到'total':0
  • 您的索引设置(分析器和映射)是什么?我使用了 default_analyzer,这可能是问题所在。
  • 我发现了问题。这次我真的是个笨蛋:我一直在尝试用不同的策划者检索记录。记录 A 具有字段 firstname,但没有字段 grade。记录 B 有 grade,但没有 firstname。我以某种方式试图汇总它。这意味着我可能不得不使用should,然后以某种方式组合代码中的记录,这是一个完全不同的问题。正确的?我猜这仅在 ElastcSearch 中是不可能的?
  • 您的索引中有多少文档?如果不是那么多,您可以删除所有数据并重新索引您的数据或不删除使用版本控制功能覆盖它,但您仍然必须删除一些虚拟数据。除了这些,我不知道可以合并这些文档的另一种解决方案。
  • 谢谢肖斯。只是这些文档是由 Couchbase 自动索引的,所以我有点无法控制它们的架构,除非我改变我在 Couchbase 中存储文档的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多