> 技术文档 > ES中常用的Query和查询作用,以及SpringBoot使用实例_springboot es常用查询

ES中常用的Query和查询作用,以及SpringBoot使用实例_springboot es常用查询


ES中常用的Query和查询作用,以及 SpringBoot 使用实例

文章目录

  • ES中常用的Query和查询作用,以及 SpringBoot 使用实例
      • MatchAllQuery
      • TermQuery
      • BoolQuery
      • RangeQuery
      • MatchQuery
      • MultiMatchQuery
      • TermsQuery
      • PrefixQuery
      • WildcardQuery
      • RegexpQuery
      • FuzzyQuery
      • DisMaxQuery
      • ExistsQuery
      • GeoDistanceQuery
      • 查询文档总数

MatchAllQuery

  • 作用:匹配索引中的所有文档。
  • Spring Boot 实例
import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void matchAllQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchAllQuery()); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); for (SearchHit<YourDocumentType> hit : searchHits.getSearchHits()) { YourDocumentType document = hit.getContent(); // 处理文档 }}

TermQuery

  • 作用:精确匹配字段的特定值,不会对查询词进行分词。
  • Spring Boot 实例
import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void termQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.termQuery(\"fieldName\", \"exactValue\")); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

BoolQuery

  • 作用:组合多个查询条件,通过 must、should、mustNot 等逻辑来筛选文档。
  • Spring Boot 实例
import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void boolQuery() { BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery(\"field1\", \"value1\")) .should(QueryBuilders.termQuery(\"field2\", \"value2\")) .mustNot(QueryBuilders.termQuery(\"field3\", \"value3\")); NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withQuery(boolQuery); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

RangeQuery

  • 作用:查询字段值在指定范围内的文档,适用于数字、日期等类型字段。
  • Spring Boot 实例
import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void rangeQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.rangeQuery(\"age\").gte(18).lte(60)); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

MatchQuery

  • 作用:对输入文本分词后在指定字段进行全文检索。

  • Spring Boot 实例

import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void matchQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery(\"fieldName\", \"searchText\")); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

MultiMatchQuery

  • 作用:在多个字段上执行与 MatchQuery 类似的全文检索。

  • Spring Boot 实例

import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void multiMatchQuery() { String[] fields = {\"field1\", \"field2\", \"field3\"}; NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.multiMatchQuery(\"searchText\", fields)); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

TermsQuery

  • 作用:一次性查询字段的多个精确值。

  • Spring Boot 实例

import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void termsQuery() { List<String> values = new ArrayList<>(); values.add(\"value1\"); values.add(\"value2\"); NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.termsQuery(\"fieldName\", values)); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

PrefixQuery

  • 作用:查找字段值以指定前缀开头的文档。

  • Spring Boot 实例

import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void prefixQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.prefixQuery(\"fieldName\", \"prefixValue\")); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

WildcardQuery

  • 作用:使用通配符*?进行模糊查询。
  • Spring Boot 实例
import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void wildcardQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.wildcardQuery(\"fieldName\", \"wildcardValue*\")); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

RegexpQuery

  • 作用:通过正则表达式匹配字段值。
  • Spring Boot 实例
import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void regexpQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.regexpQuery(\"fieldName\", \"regexpPattern\")); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

FuzzyQuery

  • 作用:在一定编辑距离内查找与查询词相似的文档。
  • Spring Boot 实例
import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void fuzzyQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.fuzzyQuery(\"fieldName\", \"fuzzyValue\")); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

DisMaxQuery

  • 作用:将多个查询组合,取得分最高的作为文档得分。
  • Spring Boot 实例
import org.elasticsearch.index.query.DisMaxQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void disMaxQuery() { DisMaxQueryBuilder disMaxQuery = new DisMaxQueryBuilder() .add(QueryBuilders.matchQuery(\"field1\", \"value1\")) .add(QueryBuilders.matchQuery(\"field2\", \"value2\")); NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withQuery(disMaxQuery); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

ExistsQuery

  • 作用:判断字段是否有值,有值的文档被匹配。
  • Spring Boot 实例
import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void existsQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.existsQuery(\"fieldName\")); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

GeoDistanceQuery

  • 作用:查询位于指定地理坐标点一定距离范围内的文档。

  • Spring Boot 实例

import org.elasticsearch.index.query.GeoDistanceQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.SearchHit;import org.springframework.data.elasticsearch.core.SearchHits;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void geoDistanceQuery() { GeoDistanceQueryBuilder geoQuery = QueryBuilders.geoDistanceQuery(\"location\") .point(37.7749, -122.4194) .distance(\"10km\"); NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withQuery(geoQuery); SearchHits<YourDocumentType> searchHits = elasticsearchOperations.search(queryBuilder.build(), YourDocumentType.class); // 处理搜索结果}

查询文档总数

以下是使用 Elasticsearch Java High Level REST Client 查询符合条件文档总数的示例代码:

import org.apache.http.HttpHost;import org.elasticsearch.action.count.CountRequest;import org.elasticsearch.action.count.CountResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.index.query.QueryBuilders;import java.io.IOException;public class ElasticsearchCountExample { public static void main(String[] args) { // 创建RestHighLevelClient实例 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost(\"localhost\", 9200, \"http\")) ); try { // 创建CountRequest对象 CountRequest countRequest = new CountRequest(\"your_index_name\"); // 设置查询条件,这里使用match查询作为示例 countRequest.query(QueryBuilders.matchQuery(\"your_field_name\", \"your_search_term\")); // 执行计数请求 CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT); long count = countResponse.getCount(); System.out.println(\"符合条件的文档总数: \" + count); } catch (IOException e) { e.printStackTrace(); } finally { try { client.close(); } catch (IOException e) { e.printStackTrace(); } } }}

在上述代码中,你需要将your_index_nameyour_field_nameyour_search_term替换为实际的值。此代码会执行计数请求并打印出符合条件的文档总数。

your_index_name 代表你要进行查询操作的具体索引名称。

your_field_name 表示你要在哪个字段上进行查询操作。比如在 products 索引中,可能会有 name 字段用于存储商品名称,price 字段用于存储商品价格,category 字段用于存储商品所属类别。

your_search_term:它指的是你在指定字段中要搜索的具体内容。例如,你想查找价格为 5000 的商品,那么 “5000” 就是搜索词;你想查找类别为 “服装” 的商品,“服装” 就是搜索词。