1、检索案例——
/**
* 请求的索引 可以使用 *号通配符 检索符合前缀的所有索引
*/
SearchRequest searchRequest = new SearchRequest("t11_pop*");
/**
* 请求体
*/
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
/**
* 分页
*/
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);
/**
* 排序,不参与得分排名
*/
searchSourceBuilder.sort("price", SortOrder.DESC);
/**
* 返回值—包含的字段与排除的字段
*/
searchSourceBuilder.fetchSource(new String[]{"*"}, Strings.EMPTY_ARRAY);
BoolQueryBuilder boolQueryBuilder= QueryBuilders.boolQuery();
/**
* 查询所有字段,分词检索(使用默认设置的分词器)
* 如:已设置了ik分词就用该分词器。效果同multi_match "fields": ["*"]
*/
QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("Java从入门到放弃");
/**
* 关键字查询,keyword类型等全匹配查询 text类型分词后的关键词
*/
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "张三");
/**
* 过滤查询-不参与分值排名(ES默认先执行filter在执行bool查询)过滤出包含字段的数据再进行检索
* 1.提高检索性能
* 2.提高检索速度
* 3.全文检索时,优先建议使用
*/
boolQueryBuilder.filter(new ExistsQueryBuilder("name"))
.filter(new ExistsQueryBuilder("title"));
boolQueryBuilder.must(queryStringQueryBuilder)
.must(queryStringQueryBuilder)
.should(queryStringQueryBuilder)
.mustNot(queryStringQueryBuilder);
//添加请求方法
searchSourceBuilder.query(boolQueryBuilder);
//添加请求体
searchRequest.source(searchSourceBuilder);
SearchResponse response = null;
try {
response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
return JSONObject.parseObject(response.toString());
2、高亮、过滤filter
/**
* 请求的索引 可以使用 *号通配符 检索符合前缀的所有索引
*/
SearchRequest searchRequest = new SearchRequest("t11_pop*");
/**
* 定义bool查询,适用于多条件组合与过滤查询filter
*/
BoolQueryBuilder boolQueryBuilder= QueryBuilders.boolQuery();
/**
* 请求方式:queryStringQueryBuilder
* 查询所有字段,分词检索(使用默认设置的分词器)
* 如:已设置了ik分词就用该分词器。效果同multi_match "fields": ["*"]
*/
QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("Java从入门到放弃");
/**
* 请求方式:termQueryBuilder
* 关键字查询,keyword类型等全匹配查询 text类型分词后的关键词
*/
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "张三");
/**
* 过滤查询-不参与分值排名(ES默认先执行filter在执行bool查询)过滤出包含字段的数据再进行检索
* 1.提高检索性能
* 2.提高检索速度
* 3.全文检索时,优先建议使用
*/
boolQueryBuilder.filter(new ExistsQueryBuilder("name"))
.filter(new ExistsQueryBuilder("title"));
/**
* bool 关键字: ⽤来组合多个条件实现复杂查询
* must: 相当于&& 同时成⽴
* should: 相当于|| 成⽴⼀个就⾏
* must_not: 相当于! 不能满⾜任何⼀个
*/
boolQueryBuilder.must(queryStringQueryBuilder)
.must(queryStringQueryBuilder)
.should(termQueryBuilder)
.mustNot(termQueryBuilder);
/**
* 定义高亮体
* 1.requireFieldMatch —false 其他字段根据关键词也高亮。 —true 只高亮检索的字段
* 2.* 代表全部字体高亮
* 3.⾃定义⾼亮标签
*/
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.requireFieldMatch(false)
.field("*")
.preTags("<span style='color:red;'>")
.postTags("</span>");
/**
* 请求体
*/
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
/**
* 1.分页
* 2.排序,不参与得分排名
* 3.包含的字段与排除的字段
* 4.添加高亮体
* 5.添加请求方法 bool
*/
searchSourceBuilder
.from(0)
.size(10)
.sort("price", SortOrder.DESC)
.fetchSource(new String[]{"*"}, Strings.EMPTY_ARRAY)
.highlighter(highlightBuilder)
.query(boolQueryBuilder);
/**
* 添加请求体
*/
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = null;
try {
searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
/**
* value 命中总数;maxScore 最大得分
*/
long value = searchResponse.getHits().getTotalHits().value;
float maxScore = searchResponse.getHits().getMaxScore();
/**
* 获取高亮字段
*/
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
Set<Map.Entry<String, HighlightField>> entrySet = highlightFields.entrySet();
for (Map.Entry<String, HighlightField> entry :entrySet) {
System.out.println("高亮字段为:" + entry.getKey());
System.out.println("高亮结果为:" + entry.getValue().fragments()[0].toString());
}
}
3、聚合查询一
SearchRequest searchRequest = new SearchRequest("fruit");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder
.query(QueryBuilders.matchAllQuery()) //查询条件
//.aggregation(AggregationBuilders.sum("sum_price").field("price"))//用来设置聚合处理 sum
//.aggregation(AggregationBuilders.avg("avg_price").field("price")) //用来设置聚合处理 avg
.aggregation(AggregationBuilders.max("max_price").field("price")) //max
.size(0);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
ParsedMax parsedMax = aggregations.get("max_price");
System.out.println(parsedMax.getValue());
4、聚合查询二
SearchRequest searchRequest = new SearchRequest("fruit");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder
.query(QueryBuilders.matchAllQuery()) //查询条件
.aggregation(AggregationBuilders.terms("title_group").field("title"))//用来设置聚合处理
.size(0);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//处理聚合结果
Aggregations aggregations = searchResponse.getAggregations();
ParsedStringTerms parsedStringTerms = aggregations.get("title_group");
List<? extends Terms.Bucket> buckets = parsedStringTerms.getBuckets();
for (Terms.Bucket bucket : buckets) {
System.out.println(bucket.getKey() + " "+bucket.getDocCount());
}