首页 文章

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

提问于
浏览
15

如何在输出存储桶中添加名为“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",
    }

}

4 回答

  • 6

    您可以使用顶部匹配聚合,如下面的链接 . 格式会略有不同,因为创建额外的聚合会将代理商名称嵌入另一个“点击”键下 .

    Adding additional fields to ElasticSearch terms aggregation

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

    这是旧帖子,然而,我遇到了同样的问题,我按照https://www.elastic.co/guide/en/elasticsearch/reference/current/agg-metadata.html给出的内容 . 添加元数据详细信息,它将作为上面结果的一部分返回 . 希望它将来有助于某人 .

  • 3

    我想你需要添加另一个“aggs” . 但它不是您想要的格式,而是输出中的另一个字段,原因是您目前正在基于“agency_code”汇总,而doc_count显示特定代理商代码出现的次数 . 现在,当您想要根据“agency_name”聚合它时,该字段可能在不同的文档中,而不是“agency_code”,并且在不同的数字中也是如此,如果它们总是存在于对,那么这个父子索引可能会有所帮助 .

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

  • 2

    ES无法一对一地了解 agency_nameagency_code Map . 因此,我会推荐一些可能的策略 .

    • 不要分析 agency_name 并在该字段上使用术语agg . 如果你真的需要对 agency_name 进行标记化,我会感到惊讶 .

    • 将id存储到关系数据库或平面文件缓存中的名称映射,并执行加入客户端

    • 将代理商文档存储为另一种类型并进行两次调用 . 第一个获取ID然后第二个通过id查找代理商

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

相关问题