【问题标题】:Elasticsearch aggregation on object对象上的 Elasticsearch 聚合
【发布时间】:2014-06-17 19:28:45
【问题描述】:

如何仅对对象属性运行聚合查询,但在结果中获取所有属性?例如我想得到[{'doc_count': 1, 'key': {'id': 1, 'name': 'tag name'}}],但得到了[{'doc_count': 1, 'key': '1']。字段“标签”的聚合返回零结果。

映射:

{
  "test": {
    "properties" : {
      "tags" : {
        "type" : "object",
        "properties": {
          "id" : {"type": "string", "index": "not_analyzed"},
          "name" : {"type": "string", "index": "not_analyzed", "enabled": false}
        }
      }
    }
  }
}

聚合查询:(按预期仅返回 ID,但如何在结果中获取 ID 和名称对?)

'aggregations': {
  'tags': {
    'terms': {
      'field': 'tags.id',
      'order': {'_count': 'desc'},
    },
  }
}

编辑: 通过在 "script": "_source.tags" 上聚合获得 ID 和名称,但仍在寻找更快的解决方案。

【问题讨论】:

  • 您找到更快的解决方案了吗?出于性能原因,我不想依赖 _source obj。
  • @Benjamin Smith,不,我没有,如果你愿意,请告诉我。
  • 标签名不是唯一的吗?为什么需要身份证?老实说,我会在这里重新考虑数据设计。

标签: elasticsearch aggregation


【解决方案1】:

您可以根据需要使用脚本,例如

"terms":{"script":"doc['tags.id'].value + '|' + doc['tags.name'].value"}

对于每个创建的存储桶,您将获得一个键,其中包含您在脚本中包含的字段的值。老实说,聚合的目的不是返回完整的文档,而是对文档组(存储桶)进行计算并返回结果,例如总和和不同的值。您对查询的实际操作是根据字段 tags.id 创建存储桶。

请记住,结果中的键将包含两个用“|”分隔的值所以你可能不得不操纵它的值来提取你需要的所有信息。

【讨论】:

  • 已经尝试过了,但由于某种原因,"terms":{"script":"doc['tags.id'].value"} 我得到了一个只有一个标签的存储桶。
  • 是的,因为在您的脚本中您只使用 tags.id 的值。您还需要将 tags.name 放在那里,请参阅我的帖子中的示例。
  • @cpard 我有一个非常相似的设置——当我尝试连接两个文档字段时,id 没有映射到正确的name,并且一些ids 被欺骗了。你确定这个方法可靠吗?这和我的映射有关吗?
  • @BenjaminSmith 你是什么意思 id 字段没有映射到正确的 name ?该脚本的思想是获取键id 的值并将其与键name 的值合并,脚本非常简单。老实说,如果不查看映射或一些示例数据,很难知道可能会出现什么问题,但如果您的文档结构或映射很复杂,它可能有助于尝试使用更简单的结构来查看脚本如何表现良好。
  • @cpard 使用脚本,我得到每个聚合的nameid - 但返回的id 不是给定name 的ID。我将创建一个新的 SO 问题并在此处向您发送 URL。
【解决方案2】:

也可以嵌套聚合,可以先按id聚合,再按名称聚合。

【讨论】:

  • 恕我直言,这将是最简单和最高效的。
【解决方案3】:

附加信息,上面的答案(cpard 的答案)与嵌套对象完美配合。也许你得到的奇怪结果是因为你使用的是对象而不是嵌套对象。

这些类型的区别在于嵌套对象保持对象中元素之间的内部关系。这就是为什么"terms":{"script":"doc['tags.id'].value + '|' + doc['tags.name'].value"} 有意义。如果使用对象类型,elasticsearch 不知道哪个tags.name 与哪个tags.id

更多详情: https://www.elastic.co/blog/managing-relations-inside-elasticsearch

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多