是否可以通过Elasticsearch聚合的键对结果进行分组?

 温柔的诱惑2012_431 发布于 2022-12-29 09:57

我正在尝试执行Elasticsearch查询,并希望Elasticsearch为我分组结果,而不是让我的客户端代码手动执行.看看Elasticsearch 文档,它看起来像是我正在寻找的存储聚合,但我找不到任何使用它的示例,或者输出看起来是什么样的,以确保这就是我想要的.

我的问题是:是否可以通过Elasticsearch中的密钥对文档进行分组?如果是这样,我如何以及在哪里可以找到有关如何操作的文档,使用查询DSL或(最好)Java API的Javadoc?

1 个回答
  • 我猜你试图通过elasticsearch中的一个字段进行分组,你可以通过使用术语聚合来实现.

    以下是使用查询dsl的方法,

    POST _search 
    {
       "aggs": {
          "genders": {
             "terms": {
                "field": "gender"
             },
             "aggs": {
                "top_tag_hits": {
                   "top_hits": {
                      "_source": {
                         "include": [
                            "include_fields_name"
                         ]
                      },
                      "size": 100
                   }
                }
             }
          }
       }
    }
    

    性别是文档中的字段,它的响应可以

    {
        ...
    
        "aggregations" : {
            "genders" : {
                "buckets" : [
                    {
                        "key" : "male",
                        "doc_count" : 10,
                        "tag_top_hits":{"hits":...}
                    },
                    {
                        "key" : "female",
                        "doc_count" : 10,
                        "tag_top_hits":{"hits":...}
                    },
                ]
            }
        }
    }
    

    使用Java api,我为你的评论添加了tophits聚合.(但不在查询dsl中)

    client.prepareSearch("index").setTypes("types").addAggregation(
                    AggregationBuilders.terms("agg_name").field("gender").subAggregation(
                            AggregationBuilders.topHits("documents").setSize(10)
                    )
            ).execute(new ActionListener<SearchResponse>() {
                @Override
                public void onResponse(SearchResponse response) {
                    Terms agg_name_aggregation=response.getAggregations().get("agg_name");
                    for (Terms.Bucket bucket : agg_name_aggregation.getBuckets()) {
                        TopHits topHits=bucket.getAggregations().get("documents");
                        System.out.println("term = " + bucket.getKey());
                        // do what you want with top hits..
                    }
                }
    
                @Override
                public void onFailure(Throwable e) {
                    e.printStackTrace();
                }
            });
    

    希望这可以帮助!!

    2022-12-29 10:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有