ElasticSearch - 如何在聚合查询中显示附加字段名称

Posted

技术标签:

【中文标题】ElasticSearch - 如何在聚合查询中显示附加字段名称【英文标题】:ElasticSearch - How to display an additional field name in aggregation query 【发布时间】:2015-10-21 16:36:09 【问题描述】:

如何在我的输出存储桶中添加一个名为“agency_name”的新密钥。

我正在运行如下所示的聚合代码


  "aggs": 
    "name": 
      "terms": 
        "field": "agency_code"
      
    
  

我将得到输出

"aggregations": 
    "name": 
        "doc_count_error_upper_bound": 130,
        "sum_other_doc_count": 39921,
        "buckets": [
            
                "key": "1000",
                "doc_count": 105163
            ,
            
                "key": "2100",
                "doc_count": 43006
            
        ]
    

显示时我需要显示机构名称、代码和 doc_count

如何修改聚合查询以便获得以下格式。我是 ElasticSearch 的新手,不知道如何解决这个问题

"aggregations": 
    "name": 
        "doc_count_error_upper_bound": 130,
        "sum_other_doc_count": 39921,
        "buckets": [
            
                "key": "1000",
                "doc_count": 105163,
                "agency_name": 'Agent 1'
            ,
            
                "key": "2100",
                "doc_count": 43006,
                "agency_name": 'Agent 2'
            
        ]
    

ElasticSearch 中的示例数据(分析字段)



    "_index": "feeds",
    "_type": "news",
    "_id": "22005",
    "_version": 1,
    "_score": 1,
    "_source": 
        "id": 22005,
        "name": "Test News",
        "agency_name": "Agent 1",
        "agency_code": "1000",
    


【问题讨论】:

【参考方案1】:

您可以使用以下链接中的热门点击聚合。格式会略有不同,因为创建额外的聚合会将代理名称嵌入到另一个“hits”键下。

Adding additional fields to ElasticSearch terms aggregation


  "aggs": 
    "name": 
      "terms": 
        "field": "agency_code"
      ,
      "aggs": 
        "agency_names" : 
           "top_hits": 
                size: 1, 
                _source: 
                    include: ['agency_name']
                
            
          
       
    
  

【讨论】:

这个解决方案效果很好。只是一个问题,如果我们在上面的查询中使用docvalue_fields 而不是_source,对性能有什么影响吗?我知道它们是两个不同的东西,只是问性能方面【参考方案2】:

我认为您需要向其中添加另一个“aggs”。但它不会采用您想要的格式,而是作为输出中的另一个字段,原因是当前您正在根据“agency_code”进行聚合,而 doc_count 显示特定机构代码出现的次数。现在,当您想根据“agency_name”聚合它时,该字段可能在与“agency_code”不同的文档中以及不同的数字中,如果它们总是成对存在,那么这个父子索引可能会有所帮助。

https://www.elastic.co/guide/en/elasticsearch/guide/current/indexing-parent-child.html

【讨论】:

看起来我不需要根据机构名称进行汇总。我的计划是,我可以通过任何方式将自定义字段添加到聚合结果中。我添加了一个示例记录来显示数据是如何保存在 elasticsearch 中的。 嗨@AmalKumarS 我想知道你是怎么解决这个问题的。 @Kailash 我无法从聚合结果中获取机构名称。我所做的是我运行了一个单独的查询来映射机构代码和机构名称。显示聚合结果时,它使用此映射来显示代理名称:(【参考方案3】:

ES 无法知道agency_nameagency_code 是一对一的映射。因此,我会推荐一些可能的策略。

不要分析 agency_name 并在该字段上使用术语 agg。如果您真的需要对 agency_name 进行标记化,我会感到惊讶。 将 id 到名称的映射存储在关系数据库或平面文件缓存中并在客户端执行连接 将代理文档存储为另一种类型并进行两次调用。第一个获取 id,然后第二个通过 id 查找机构

正如上面提到的 Aditya Patel,父子关系也可能会有所帮助,但我相信您仍然必须使用上述策略之一来解决 id->name 映射。

【讨论】:

我将 id 到名称映射存储在关系数据库中,并在客户端进行连接作为修复【参考方案4】:

这是旧帖子,但是,我遇到了同样的问题,我按照https://www.elastic.co/guide/en/elasticsearch/reference/current/agg-metadata.html 给出的内容进行操作。添加元数据详细信息,并将其作为存储桶上方结果的一部分返回。希望它将来对某人有所帮助。

【讨论】:

这不是他要求的【参考方案5】:

我所做的是使用类似于以下查询的内容:

"aggs" : 
    "products" : 
      "filter" :  "term":  "item.category": "children" ,
      "aggs" : 
        "count" : 
          "terms" : 
            "script": "doc['item.id'].value + ':' + doc['item.name'].value"
          
        
      
    
  

返回如下内容:

...
"aggregations" : 
    "products" : 
      "doc_count" : 1050,
      "count" : 
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          
            "key" : "x2_90QBj9k:Baby Oil",
            "doc_count" : 45
          ,
          ...
        ]
...

然后我可以对 bucket[i]["key"] 使用一个字符串操作,为循环中的每个 i 提取相关字段。

【讨论】:

以上是关于ElasticSearch - 如何在聚合查询中显示附加字段名称的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch系列---聚合查询原理

Elasticsearch 聚合功能

Elasticsearch聚合查询

Elasticsearch SQL 类似子查询聚合

如何通过Elasticsearch 6.x中的动态或未知字段进行聚合

Elasticsearch聚合的嵌套桶如何排序