上一篇:Elasticsearch Java REST Client 批量操作(Bulk API)
Search Request# 无参数获取所有
@GetMapping("test")
public SearchHits test() throws IOException {
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
Iterator iterator = hits.iterator();
while (iterator.hasNext()){
SearchHit next = iterator.next();
Map sourceAsMap = next.getSourceAsMap();
System.out.println(sourceAsMap);
}
return hits;
}
# new SearchRequest() 没有参数,这将针对所有索引
# 指定索引范围,只检索指定索引的数据
SearchRequest searchRequest = new SearchRequest ( "index" );
# 设置IndicesOptions控制如何解决不可用的索引以及如何扩展通配符表达式
searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen());
# 使用首选项参数,例如执行搜索以首选本地分片。默认设置是跨分片随机化
searchRequest.preference("_local");
SearchSourceBuilder
# 指定检索参数和结果数量,可不分索引检索
@GetMapping("test1")
public SearchResponse test1() throws IOException {
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("name", "川"));
sourceBuilder.from(0);
sourceBuilder.size(5);
searchRequest.source(sourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
return search;
}
MatchQueryBuilder
# 方式一
@GetMapping("test2")
public SearchResponse test2() throws IOException {
SearchRequest searchRequest = new SearchRequest();
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder ( "name" , "蟒" );
// 在匹配查询上启用模糊匹配
matchQueryBuilder.fuzziness(Fuzziness.AUTO);
// 匹配查询上设置前缀长度选项
matchQueryBuilder.prefixLength(3);
// 设置最大扩展选项来控制查询的模糊过程
matchQueryBuilder.maxExpansions(10);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// sourceBuilder.query(QueryBuilders.termQuery("name", "新"));
// sourceBuilder.from(0);
// sourceBuilder.size(5);
sourceBuilder.query(matchQueryBuilder);
searchRequest.source(sourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
return search;
}
# 方式二
@GetMapping("test3")
public SearchResponse test3() throws IOException {
SearchRequest searchRequest = new SearchRequest();
QueryBuilder queryBuilder = QueryBuilders.matchQuery("name","汝")
.fuzziness(Fuzziness.AUTO)
.prefixLength(3)
.maxExpansions(10);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
searchRequest.source(sourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
return search;
}
排序
@GetMapping("test")
public SearchHits test() throws IOException {
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
// 通过_id排序
searchSourceBuilder.sort("_id",SortOrder.DESC);
// 通过_score 排序
searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.ASC));
// 自定义字段排序
searchSourceBuilder.sort(new FieldSortBuilder("age").order(SortOrder.ASC));
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
Map sourceAsMap = next.getSourceAsMap();
System.out.println(sourceAsMap);
}
return hits;
}
# 关闭source抓取和过滤、排除字段
@GetMapping("test")
public SearchHits test() throws IOException {
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
// 通过_id排序
searchSourceBuilder.sort("_id",SortOrder.DESC);
// 通过_score 排序
searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.ASC));
// 自定义字段排序
searchSourceBuilder.sort(new FieldSortBuilder("age").order(SortOrder.ASC));
// 关闭源文件_source置空
searchSourceBuilder.fetchSource(false);
// 过滤展示字段
String[] includeFields = new String[] {"name", "age"};
// 排除不需要的字段
String[] excludeFields = new String[] {"birthday"};
searchSourceBuilder.fetchSource(includeFields, excludeFields);
searchRequest.source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
Iterator iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit next = iterator.next();
Map sourceAsMap = next.getSourceAsMap();
System.out.println(sourceAsMap);
}
return hits;
}
结果高亮
高亮搜索结果可以通过HighlightBuilder在 SearchSourceBuilder. 通过将一个或多个HighlightBuilder.Field实例添加到HighlightBuilder.
@GetMapping("test6")
public SearchResponse test6() throws IOException {
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构建高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 高亮设置
HighlightBuilder.Field hightName = new HighlightBuilder.Field("name");
// 设置高亮类型,支持高亮类型:unified,plain和fvh
hightName.highlighterType("plain");
highlightBuilder.field(hightName);
// 默认高亮 unified
HighlightBuilder.Field hightAge = new HighlightBuilder.Field("mobile");
highlightBuilder.field(hightAge);
sourceBuilder.highlighter(highlightBuilder);
QueryBuilder queryBuilder = QueryBuilders.matchQuery("name","汝");
sourceBuilder.query(queryBuilder);
searchRequest.source(sourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
return search;
}
聚合搜索
@GetMapping("test7")
public SearchResponse test7() throws IOException {
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//terms 中的参数可自定义
TermsAggregationBuilder aggregation = AggregationBuilders.terms("app_user")
// 类似于group by的字段
.field("birthday");
// 聚合求平均数
aggregation.subAggregation(AggregationBuilders.avg("average_age")
.field("age"));
sourceBuilder.aggregation(aggregation);
// 模糊查询
QueryBuilder queryBuilder = QueryBuilders.matchQuery("name","汝");
sourceBuilder.query(queryBuilder);
searchRequest.source(sourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
return search;
}
SwarchResponse
# http状态码及执行时间、是否提前终止 RestStatus status = searchResponse.status(); Timevalue took = searchResponse.getTook(); Boolean terminatedEarly = searchResponse.isTerminatedEarly(); boolean timedOut = searchResponse.isTimedOut();结果数据获取
# 结果文档
SearchHits hits = searchResponse.getHits();
# 命中总数
long totalHits = hits.getTotalHits();
# 最高分
float maxScore = hits.getMaxScore();
# 迭代获取搜索结果
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
// do something with the SearchHit
# 获取索引
String index = hit.getIndex();
# 类型(doc)
String type = hit.getType();
# 获取内部id
String id = hit.getId();
float score = hit.getScore();
# 获取字符串结果
String sourceAsString = hit.getSourceAsString();
# 获取map结果
Map sourceAsMap = hit.getSourceAsMap();
# 获取执行key数据
String documentTitle = (String) sourceAsMap.get("name");
List
获取高亮数据
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
Map highlightFields = hit.getHighlightFields();
HighlightField highlight = highlightFields.get("age");
Text[] fragments = highlight.fragments();
String fragmentString = fragments[0].string();
}
获取聚合数据
Aggregations aggregations = searchResponse.getAggregations();
Terms byCompanyAggregation = aggregations.get("app_user");
Bucket elasticBucket = byCompanyAggregation.getBucketByKey("Elastic");
Avg averageAge = elasticBucket.getAggregations().get("average_age");
double avg = averageAge.getValue();
更多请戳官网



