一、高亮查詢方案
- 1、直接基於http發送請求
- 2、基於springboot Repositories
- 3、基於原生Rest Client(HighRestClient)
二、具體實現
1、直接基於http發送請求
#詞頻統計
DELETE message_index
#創建索引數據結構
PUT message_index
{
"mappings": {
"properties":{
"message": {
"analyzer": "ik_smart",
"type": "text",
"fielddata":"true"
}
}
}
}
#增加doc1
PUT /message_index/_doc/1
{
"message":"沉溺於「輕易獲得高成就感」的事情:有意無意地尋求用很小付出獲得很大「回報」的偏方,哪怕回報是虛擬的"
}
#增加doc2
PUT /message_index/_doc/2
{
"message":"過度追求“短期回報”可以先思考這樣一個問題:為什么玩王者榮耀沉溺我們總是停不下來回報"
}
#增加doc3
PUT /message_index/_doc/3
{
"message":"過度追求的努力無法帶來超額的回報,就因此放棄了努力。這點在聰明人身上尤其明顯。以前念本科的時候身在沉溺"
}
#aggs為Aggregations(聚合)縮寫
#size 10 為前10的統計結果
#默認熱點降序出結果
POST /message_index/_search
{
"size" : 0,
"aggs" : {
"messages" : {
"terms" : {
"size" : 10,
"field" : "message"
}
}
}
}
當方法使用的是fielddata的方式,另外就是也有使用keyword的方式。keyword與fielddata類似。他們都有一些弊端,如fielddata會占用堆空間,keyword不支持分詞(適合放一些類似郵件賬號這種數據)。在官網還有另一種詞頻統計的方法,就是termvectors詞條向量的方式,具體見以下鏈接。
Term vectors API | Elasticsearch Reference [7.9] | Elastic
2、基於springboot Repositories
暫時沒有找到Repositories詞頻統計的代碼,如果有這塊代碼的大神歡迎留言
3、基於原生Rest Client(HighRestClient)
/**
* 詞頻統計aggregate
*/
@Test
public void aggregate() throws IOException {
SearchRequest searchRequest = new SearchRequest("person-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder aggregation = AggregationBuilders.terms("person-aggregate")
.field("firstname");
searchSourceBuilder.aggregation(aggregation);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
Terms byCompanyAggregation = aggregations.get("person-aggregate");
List<? extends Terms.Bucket> elasticBucket = byCompanyAggregation.getBuckets();
elasticBucket.forEach(el -> {
log.info("key:" + el.getKeyAsString());
log.info("doc_count:" + el.getDocCount());
});
}
源代碼倉庫:
https://gitee.com/hankzhousandyos/springboot-elasticsearch
最新Java Elasticsearch 7.10教程(匯總)
玄明Hanko:最新Java Elasticsearch 7.10教程(匯總)