Spring中,使用RestHighLevelClient查询es

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2020/08/spring-zhong-shi.html

elasticsearch 的java驱动中,提供了许多查询尔对构造方式,如下:

org.elasticsearch.index.query.QueryBuilders

queryName说明关键词分词
matchAllQuery查询所有
matchQuery分词
multiMatchQuery分词
matchPhraseQuery
matchPhrasePrefixQuery
idsQuery根据_id查询文档
termQuery匹配term
termsQuery匹配任何一个term
fuzzyQuery模糊,相似(自动判断)
prefixQuerystart with
rangeQuery范围(gt、lt、gte、lte)
wildcardQuery模糊(*匹配任意、?匹配单个字符)
regexpQueryk.*y 匹配 ky、key
queryStringQuery编写query_string(不推荐)
simpleQueryStringQuery编写query_string
existsQuery存在某个字段

Term查询不会对字段进行分词查询,会采用精确匹配。

Match会根据该字段的分词器,进行分词查询。

es中有以上常用的查询,bool查询就是使用must、should、must_not组合以上各个查询的查询方式。

RestHighLevelClient查询es示例

 ​
  @Autowired
     private RestHighLevelClient esClient;
     /**
      * 使用boolQuery查询es
      * @param indices 索引名称
      * @return
      */
     public Map<String, List<SearchHit>> esBoolQuery(String... indices) {
         SearchRequest searchRequest = new SearchRequest(indices);
         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
         // 建立一个bool查询
         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
         boolQueryBuilder.must(
                 QueryBuilders.rangeQuery("month")
                        .gte(startMonth)
                        .lte(endMonth)
                )
                .mustNot(
                         QueryBuilders.matchPhraseQuery("idCardNo", idNo).boost(1.2F)
                )
                .filter(
                         QueryBuilders.fuzzyQuery("name", "王")
                )
                .filter(
                         QueryBuilders.wildcardQuery("name", "王*")
                );
         sourceBuilder.query(boolQueryBuilder);
         // 包含字段和忽略字段
         sourceBuilder.fetchSource(new String[]{"name", "age"}, new String[]{"id"});
         // 排序
         sourceBuilder.sort("name", SortOrder.DESC);
         // 分页
         sourceBuilder.from(0);
         sourceBuilder.size(10);
         // 聚合函数
         sourceBuilder.aggregation(AggregationBuilders.sum("age"));
         // 高亮
         HighlightBuilder highlightBuilder = new HighlightBuilder();
         highlightBuilder.preTags("<span class=\"highlight\">");
         highlightBuilder.postTags("</span>");
         highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
         sourceBuilder.highlighter(highlightBuilder);
 ​
         searchRequest.source(sourceBuilder);
         // 查询
         SearchResponse response;
         try {
             response = esClient.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
             LOGGER.error("es查询失败!", e);
             return null;
        }
         // 处理查询结果
         SearchHits hits = response.getHits();
 ​
         return Arrays.stream(hits.getHits()).collect(Collectors.groupingBy(SearchHit::getIndex));
    }

发表评论