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字符串