当前位置: 首页 > 面试题库 >

elasticsearch:如何获取3个或更多字段的多个组合的结果

后凯捷
2023-03-14
问题内容

在elasticsearch中,如果我有带有Foo Bar Baz Qux属性的文档说,还有其他一些属性。

我需要以以下方式查询结果

Foo Bar Baz Qux
foo1 bar1 baz1 qux1
foo1 bar1 baz1 qux2
foo1 bar1 baz2 qux1
foo1 bar1 baz2 qux2
foo1 bar2 baz1 qux1

基本上,我需要doc_count可用的所有组合。使用该结果,可以说 在Foo = foo1,Bar = bar1,Baz = baz1,Qux =
qux1的情况下,有20个文档/记录。

粗略的方法是,在terms聚合内部使用聚合terms(在这种情况下为4次)。

应该有一些更简单的方法可以做到这一点。

提前致谢


问题答案:

您提到的4种嵌入式terms聚合方式是一个很好的方法。

另一种方法是将单个terms聚合与一起使用script,这将创建由您要聚合的四个术语组成的假术语,如下所示:

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

注意:请确保启用动态脚本,以使用上述脚本聚合。

为了在搜索时节省一些周期的另一种html" target="_blank">解决方案是在索引时在另一个字段中创建该聚合项,然后将其用于单个terms聚合中。

编辑:如果结果的顺序很重要,则应基于doc_count进行排序 foo

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


 类似资料:
  • 在弹性搜索中,如果我有属性为Foo的文档,比如Bar和其他一系列属性。 我需要以这样的方式查询,我得到的结果在下面的方式 基本上,我需要doc\u 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第

  • 问题内容: 我试图找到与当前正在查看的标签相关的标签。我们索引中的每个文档都被标记。每个标签由两部分组成-ID和文本名称: 要获取相关标签,我只是查询文档并获取其标签的集合: 这非常有效,我得到了想要的结果。但是,我需要标签ID 和 名称才能执行任何有用的操作。我已经探索了如何做到这一点,解决方案似乎是: 索引时合并字段 将字段拼凑在一起的脚本 嵌套聚合 选项1和2对我不可用,因此我一直在使用3,

  • 这工作得很完美,我得到了我想要的结果。但是,我需要标记ID和名称来做任何有用的事情。我已经探索了如何实现这一点,解决方案似乎是: 索引时合并字段 将字段集中在一起的脚本 嵌套聚合 选项一和选项二对我来说是不可用的,所以我一直在用3,但它没有以预期的方式做出反应。给定以下查询(仍在搜索还标记有“饼干”的文档): 我会得到这个结果: 嵌套聚合包括搜索项和我要搜索的标记(按字母顺序返回)。 我曾试图通过

  • 问题内容: 我发现的唯一接近的事情是:Elasticsearch中的多个分组方式 基本上,我试图获得与以下查询等效的ES : 年龄和性别本身很容易获得: 这使: 但是现在我需要这样的东西: 请注意,这是针对年龄范围的“映射”,因此它们实际上表示的是:)而不是数字。例如,性别[1](“男性”)细分为[246]的年龄范围[0](“18岁以下”)。 问题答案: 由于您只有2个字段,因此一种简单的方法是使

  • 这个问题不是如何通过多个字段进行聚合,我们可以使用子聚合。 如果你知道SQL,我可以给你一个完美的解释: 我们能在Elasticsearch中实现这一点吗? 谢谢。