1. 实现查询去重、分页,例如:实现依据qid去重,createTime排序,命令行为:ui
GET /nb_luban_answer/_search { "query": { "match": { "status": 1 } }, "sort": [ { "createTime": { "order": "desc" } } ],"aggs": { "qid": { "terms": { "field": "qid", "size": 10 },"aggs": { "rated": { "top_hits": { "sort": [{ "createTime": {"order": "desc"} }], "size": 1 } } } } }, "size": 0, "from": 0 }
JAVA APIspa
String indexName="nb_luban_answer"; String typeName="luban_answer"; AggregationBuilder aggregation = AggregationBuilders .terms("agg").field("qid") .subAggregation( AggregationBuilders.topHits("top").addSort("createTime",SortOrder.DESC).setSize(1) ); SearchResponse sResponse = Tool.CLIENT.prepareSearch(indexName).setTypes(typeName) .setQuery(QueryBuilders.matchQuery("status",1)) .addSort("createTime", SortOrder.DESC) .addAggregation(aggregation) .execute().actionGet(); Terms agg = sResponse.getAggregations().get("agg"); for (Terms.Bucket entry : agg.getBuckets()) { String key = String.valueOf(entry.getKey()) ; long docCount = entry.getDocCount(); System.out.println("key:"+ key +" doc_count:"+ docCount); TopHits topHits= entry.getAggregations().get("top"); for (SearchHit hit : topHits.getHits()){ System.out.println(" -> id: "+ hit.getId()+" createTime: "+hit.getSource().get("createTime")); } }
2. 取得某个索引中某个字段中的全部出现过的值.net
这种操做相似于使用SQL的SELECT UNIQUE语句。当须要获取某个字段上的全部可用值时,能够使用terms聚合查询完成:eg: select distinct street_name from table_name ;命令行
GET /index_streets/_search?search_type=count { "aggs": { "street_values": { "terms": { "field": "name.raw", "size": 0 } } } }
由于目标是获得name字段上的全部出现过的值,所以search_type被设置为了count,这样在返回的响应中不会出现冗长的hits部分。另外,查询的目标字段的索引类型须要设置为not_analyzed。因此上面的field指定的是name.raw。code
3. 取得某个索引/类型下某个字段中出现的不一样值的个数blog
这种操做相似于使用SQL的select count( * ) from (select distinct * from table)语句。当须要获取某个字段上的出现的不一样值的个数时,能够使用cardinality聚合查询完成:排序
GET /index_streets/_search?search_type=count { "aggs": { "uniq_streets": { "cardinality": { "field": "name.raw" } } } }
由于目标是获得name字段上的全部出现过的值,所以search_type被设置为了count,这样在返回的响应中不会出现冗长的hits部分。另外,查询的目标字段若是是字符串类型的,那么其索引类型须要设置为not_analyzed。因此上面的field指定的是name.raw。索引
转自:https://blog.csdn.net/a422100210/article/details/60959450字符串