使用Java实现Elasticsearch的分组功能
来源:互联网 发布:九云图软件 编辑:程序博客网 时间:2024/06/06 05:07
ES上有如下数据
如果想根据class对student进行分组
GET school/student/_search?search_type=count{"aggs": { "class": { "terms": { "field": "class", "size": 100 } } }搜索结果:
结果被放入到buckets中,key=1表示class的值为1(对class进行分组),doc_count为class=1的文档数,如果想用java代码实现此功能呢?
1.创建带分组的搜索方法
public class ElasticsearchUtils { private Client client; public ElasticsearchUtils(String clusterName, String ipAddress) { Settings settings = ImmutableSettings .settingsBuilder() //设置集群名称 .put("cluster.name", clusterName) .put("client.transport.ignore_cluster_name", false) .put("node.client", true).put("client.transport.sniff", true) .build(); client = new TransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));/** * 执行搜索(带分组) * @param indexName 索引名称 * @param typeName 类型名称 * @param queryBuilder 查询内容 * @param aggsField 要分组的字段 * @return */ public Map<String, String> searcher(String indexName, String typeName, QueryBuilder queryBuilder, String aggsField) { SearchRequestBuilder searchRequestBuilder = client .prepareSearch(indexName).setTypes(typeName) .setQuery(queryBuilder); //创建TermsBuilder对象,使用term查询,设置该分组的名称为aggs-class,并根据aggsField字段进行分组 TermsBuilder termsBuilder = AggregationBuilders.terms("aggs-class") .field(aggsField);//此处也可继续设置order、size等 //添加分组信息 searchRequestBuilder.addAggregation(termsBuilder); //执行搜索 SearchResponse searchResponse = searchRequestBuilder.execute() .actionGet(); //解析返回数据,获取分组名称为aggs-class的数据 Terms terms = searchResponse.getAggregations().get("aggs-class"); Collection<Terms.Bucket> buckets = terms.getBuckets(); Map<String, String> dataMap = new HashMap<String, String>(); for (Terms.Bucket bucket : buckets) { String key = bucket.getKey(); dataMap.put(key, bucket.getDocCount() + ""); } return dataMap; } }
2.main函数
public class AggregationTest { public static void main(String[] args) { //创建对象,设置集群名称和IP地址 ElasticsearchUtils es = new ElasticsearchUtils("im_shanmenglu", "localhost"); String indexName = "school";//索引名称 String typeName = "student";//类型名称 String aggsField = "class";//要分组的字段 //分组搜索 Map<String, String> dataMap = es.searcher(indexName, typeName, null, aggsField); //解析结果 for (Map.Entry<String, String> entry : dataMap.entrySet()) { System.out.println("class = " + entry.getKey() + ", Value = " + entry.getValue()); } //输出class = 2, Value = 2(class=2的数据有2条) // class = 1, Value = 5(class=1的数据有5条) }}
0 0
- 使用Java实现Elasticsearch的分组功能
- java 实现数据库分组功能
- ElasticSearch Java分组查询
- java 实现类似于oracle分组统计的功能
- Java实现MongoDB的日期(Date)分组功能
- Elasticsearch Java API 的使用(13)—分组聚合之一
- 使用DATATGRID实现分组小计功能
- Java实现GroupBy/分组TopN功能
- 使用Elasticsearch的java api,操作elasticsearch
- elasticsearch JAVA客户端操作---搜索的过滤、分组高亮
- SQL分组小计功能的实现
- 解决问题之道--使用Java实现数据的分组求和
- Extjs中store分组功能的使用
- Elasticsearch的功能、使用场景以及特点
- Android ListView的分组显示,分组标题悬浮,点击查看分组的功能实现
- ElasticSearch Java API的使用
- Elasticsearch的Java API使用
- RecyclerView分组之BaseRecyclerViewAdapterHelper(实现分组功能)
- 机房收费系统---可行性研究报告
- (笔记)Spring MVC学习指南_验证器
- 如何做好一名软件开发团队的领导者
- RDD详解
- Freefloat FTP Server 1.0溢出漏洞分析
- 使用Java实现Elasticsearch的分组功能
- Java Servlet之编写第一个Servlet
- lame静态库制作
- 《Android开发艺术探索》第三章笔记
- [LeetCode]Longest Palindromic Substring
- cs231n学习笔记-CNN-目标检测、定位、分割
- scanf怎样获取一个句子
- 查找子串的数量
- java多线程