//聚合查询
@Test
void Collection_query() throws IOException {
SearchRequest searchRequest = new SearchRequest().indices("users");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
//条件max("maxid") maxid:结果名称
MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("maxid").field("id");
//聚合查询 aggregation
searchSourceBuilder.aggregation(maxAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//获取聚合后的结果 可以使用类型强转
Max max = (Max) searchResponse.getAggregations().asMap().get("maxid");
System.out.println(max.getValue());
}
//分组查询
//按名字分组 子聚合里面查看平均年龄
@Test
void group_search() throws IOException {
Logger logger = LogManager.getRootLogger();
SearchRequest searchRequest = new SearchRequest("users");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.size(0);//不返回 hits 里的数据 提高性能
searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
//按照name分组
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("nameGroup").field("name.keyword");
//子聚合 平均age
termsAggregationBuilder.subAggregation(AggregationBuilders.avg("avg_age").field("age"));
//聚合查询 aggregation
searchSourceBuilder.aggregation(termsAggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
Map<String, Aggregation> asMap = searchResponse.getAggregations().getAsMap();
//需要强转
Terms terms = (Terms) asMap.get("nameGroup");
logger.info(terms.getDocCountError());
logger.info(terms.getSumOfOtherDocCounts());
for (Terms.Bucket bucket : terms.getBuckets()) {
logger.info("key: " + bucket.getKeyAsString());
logger.info("docCount: " + bucket.getDocCount());
logger.info("docCountError: " + bucket.getDocCountError());
//注意这里用 具体聚合类型接受 平均:Avg
Avg avg_age = bucket.getAggregations().get("avg_age"); //获取子聚合
logger.info("avg_age:" + avg_age.getValue());
logger.info("------------------------------------");
}
}
/*
es的建议搜索 suggest_mode:建议模式 missing,popular,always
GET users/_search
{
"suggest": {
"name_suggest": {
"text": "迪丽热巴5",
"term": {
"field": "name.keyword",
"suggest_mode":"popular"
}
}
}
}
* */
//建议查询
//词项建议拼写检查,检查用户的拼写是否错误,如果有错给用户推荐正确的词,appel->apple
@Test
void suggest_search() throws IOException {
Logger logger = LogManager.getRootLogger();
SearchRequest searchRequest = new SearchRequest("users");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.size(0);
searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
//创建termSuggestion聚合
TermSuggestionBuilder termSuggestionBuilder = SuggestBuilders.termSuggestion("name.keyword").text("迪丽热巴9");
//可以设置建议模式 默认为 missing :意思是 分词器没有才能查询出
termSuggestionBuilder.suggestMode(TermSuggestionBuilder.SuggestMode.POPULAR);
//创建主建议查询类
SuggestBuilder suggestBuilder = new SuggestBuilder();
//指定名字 并添加
suggestBuilder.addSuggestion("suggest_name", termSuggestionBuilder);
//放入条件
searchSourceBuilder.suggest(suggestBuilder);
//加入搜索请求
searchRequest.source(searchSourceBuilder);
//执行 返回结果
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//处理结果 注意:用TermSuggestion接受(自动转换)
TermSuggestion termSuggestion = searchResponse.getSuggest().getSuggestion("suggest_name");
for (TermSuggestion.Entry entry : termSuggestion.getEntries()) {
//获取自己的数据text: 迪丽热巴9
logger.info("text: " + entry.getText().string());
for (TermSuggestion.Entry.Option option : entry) {
/*
结果集数据
: suggest option : 迪丽热巴2
: suggest option : 迪丽热巴3
: suggest option : 迪丽热巴
* */
String suggestText = option.getText().string();
logger.info(" suggest option : " + suggestText);
}
}
}
/*
#自动补全功能 必须数据类型为completion
根据用户的输入联想到可能的词或者短语
GET movies/_search
{
"_source": "",
"suggest": {
"name_suggest": {
"prefix": "ht",
"completion": {
"field": "name"
}
}
}
}
* */
@Test
void suggest_prefix() throws IOException {
Logger logger = LogManager.getLogger();
SearchRequest searchRequest = new SearchRequest("movies");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.size(0);
searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
SuggestBuilder suggestBuilder = new SuggestBuilder();
//skipDuplicates 跳过重复项 默认false
CompletionSuggestionBuilder completionSuggestionBuilder = SuggestBuilders.completionSuggestion("name").prefix("ht").skipDuplicates(true);
suggestBuilder.addSuggestion("name_suggest", completionSuggestionBuilder);
searchSourceBuilder.suggest(suggestBuilder);
searchRequest.source(searchSourceBuilder);
//发送请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//处理请求 注意 用聚合后的结果类型接受 (自动转换)
CompletionSuggestion completionSuggestion=searchResponse.getSuggest().getSuggestion("name_suggest");
for (CompletionSuggestion.Entry options : completionSuggestion) {
//自己传入的参数 ht
logger.info(" text:"+options.getText().string());
for (CompletionSuggestion.Entry.Option option : options) {
logger.info(" suggest option : "+option.getText().string());
}
/*
2021-05-06 09:44:21.924 INFO 21636 --- [ main] c.h.s.SpringdataEsApplicationTests : text: ht
2021-05-06 09:44:21.928 INFO 21636 --- [ main] c.h.s.SpringdataEsApplicationTests : suggest option : htaaaa
2021-05-06 09:44:21.928 INFO 21636 --- [ main] c.h.s.SpringdataEsApplicationTests : suggest option : htbbbb
2021-05-06 09:44:21.929 INFO 21636 --- [ main] c.h.s.SpringdataEsApplicationTests : suggest option : htcccc
2021-05-06 09:44:21.930 INFO 21636 --- [ main] c.h.s.SpringdataEsApplicationTests : suggest option : htdddd
2021-05-06 09:44:21.931 INFO 21636 --- [ main] c.h.s.SpringdataEsApplicationTests : suggest option : hteeee
* */
}
}
es高级客户端聚合查询api快速入门
最新推荐文章于 2023-03-14 21:46:30 发布