栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Elasticsearch Java REST Client Search APIs

Elasticsearch Java REST Client Search APIs

上一篇: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 users = (List) sourceAsMap.get("age");
	Map innerObject =(Map) sourceAsMap.get("innerObject");
}

 
获取高亮数据 
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();

更多请戳官网

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号