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_name
、your_field_name
和your_search_term
替换为实际的值。此代码会执行计数请求并打印出符合条件的文档总数。
your_index_name
代表你要进行查询操作的具体索引名称。
your_field_name
表示你要在哪个字段上进行查询操作。比如在 products
索引中,可能会有 name
字段用于存储商品名称,price
字段用于存储商品价格,category
字段用于存储商品所属类别。
your_search_term
:它指的是你在指定字段中要搜索的具体内容。例如,你想查找价格为 5000 的商品,那么 “5000” 就是搜索词;你想查找类别为 “服装” 的商品,“服装” 就是搜索词。