当前位置: 首页 > 知识库问答 >
问题:

弹性搜索:如何获取3个或更多字段的多个组合的结果

白博易
2023-03-14

在弹性搜索中,如果我有属性为Foo的文档,比如Bar和其他一系列属性。

我需要以这样的方式查询,我得到的结果在下面的方式

FooBar1 baz1 qux1
FooBar1 baz1 qux1
FooBar1 baz1 qux2
FooBar1 baz2 qux1

基本上,我需要doc\u count的所有可用组合。使用该结果,可以说,如果Foo=foo1,Bar=bar1,Baz=baz1,Qux=qux1,则有20个文档/记录

粗暴的方式是,使用术语聚合内部的术语聚合(在这种情况下为4次)。

应该有更简单的方法来做到这一点。

提前感谢

共有1个答案

曹伟泽
2023-03-14

你提到4个嵌入式术语的方式很好。

另一种方法是使用单个术语聚合和脚本,该脚本将创建一个由您尝试聚合的四个术语组成的假术语,如下所示:

{
   "size": 0,
   "aggs": {
      "combinations": {
          "terms": {
              "script": "[doc.foo.value, doc.bar.value, doc.baz.value, doc.qux.value].join(',')"
          }
      }
   }
}

注意:确保启用动态脚本才能使用上述脚本聚合。

为了在搜索时节省一些周期,另一个解决方案是在索引时在另一个字段中创建聚合项,然后在单个聚合中使用该聚合项。

编辑:如果结果的顺序很重要,则应根据foo的doc\u计数进行排序

{
   "size": 0,
   "aggs": {
        "primary": {
            "terms": {
                "field": "foo"
            },
           "aggs": {
               "combinations": {
                   "terms": {
                   "script": "[doc.foo.value, doc.bar.value, doc.baz.value, doc.qux.value].join(',')"
                   }
               }
           }
     }
}
 类似资料:
  • 问题内容: 在elasticsearch中,如果我有带有 属性的文档说,还有其他一些属性。 我需要以以下方式查询结果 基本上,我需要doc_count可用的所有组合。使用该结果,可以说 在Foo = foo1,Bar = bar1,Baz = baz1,Qux = qux1的情况下,有20个文档/记录。 粗略的方法是,在聚合内部使用聚合(在这种情况下为4次)。 应该有一些更简单的方法可以做到这一点

  • 问题内容: 我正在使用JPA 2.0 /hibernate验证来验证我的模型。我现在遇到一种情况,必须验证两个字段的组合: 该模型是无效的,如果都和都null和其他有效。 如何使用JPA 2.0 / Hibernate执行这种验证?使用简单的注释,两个吸气剂都必须为非null才能通过验证。 问题答案: 对于多属性验证,应使用类级别的约束。摘自 Bean Validation Sneak Peek第

  • 我有一个弹性搜索中按查询更新的用例。 我把一个医生- null 然而,这一次也失败了。 任何关于使用Where更新可以做什么的想法。提前致谢

  • 如何在elasticsearch中使用与聚合相关的过滤器? 官方文档只给出了过滤器和聚合的小例子,没有对查询dsl进行正式描述——例如,将其与postgres文档进行比较。 通过尝试,我发现以下查询被elasticsearch接受(没有解析错误),但忽略了给定的过滤器: 有些人建议使用查询而不是过滤。但官方文件通常建议对精确值进行过滤。查询的另一个问题是:虽然过滤器提供了和,但查询不提供。 有人能

  • 问题内容: 我第一次使用Postgresql,并且试图在我的网站中创建一个搜索引擎。我有这张桌子: 然后我为表的每个字段创建了一个索引(这是正确的方法吗?或者我可以为所有字段创建一个索引?): 现在,如果我想在每个索引中搜索一个单词,SQL查询是什么? 我尝试了这个,它的工作原理: 是否存在更好的方法来做到这一点?我可以搜索多个吗?我的一个朋友提出了一个解决方案,但这是针对MySQL数据库的: P

  • 我无法编写请求主体来获取弹性搜索中多个字段上的平均聚合。 我有两个字段field1和field2都是“double”数据类型。我能够获取单个字段的平均聚合。 这适用于单个字段: 和两个字段(给出错误) 我收到的错误是“类型为[avg]的聚合器[group\U By\U field1]无法接受子聚合”“无法解析名为[AVGVALUESOFCITEMPIDE]的BaseAgregationBuilde