对象的弹性搜索聚合

Dmy*_*hyi 14 aggregation elasticsearch

如何仅在对象属性上运行聚合查询,但获取结果中的所有属性?我希望得到[{'doc_count': 1, 'key': {'id': 1, 'name': 'tag name'}}],但[{'doc_count': 1, 'key': '1']相反.字段'tags'上的聚合返回零结果.

制图:

{
  "test": {
    "properties" : {
      "tags" : {
        "type" : "object",
        "properties": {
          "id" : {"type": "string", "index": "not_analyzed"},
          "name" : {"type": "string", "index": "not_analyzed", "enabled": false}
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

'aggregations': {
  'tags': {
    'terms': {
      'field': 'tags.id',
      'order': {'_count': 'desc'},
    },
  }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 5

如果你愿意,你可以使用脚本,例如

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

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

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


Tho*_*aux 5

也可以嵌套聚合,您可以按 id 聚合,然后按名称聚合。