ElasticSearch springboot中使用QueryBuilders

本文介绍了如何在SpringBoot应用中利用Elasticsearch的QueryBuilders进行高效查询和聚合分析,包括基础查询构造、高级搜索技巧和实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                          ElasticSearch  springboot中使用QueryBuilders

 

https://blog.csdn.net/csdn_20150804/article/details/105618933
https://blog.csdn.net/Delicious_Life/article/details/104293548
Elasticsearch--Aggregation详细总结(聚合统计)
https://blog.csdn.net/donghaixiaolongwang/article/details/58597058

### 集成与使用Elasticsearch实现文档检索功能 #### 启动Elasticsearch 在开始集成之前,需要先启动Elasticsearch服务。可以通过下载Elasticsearch的安装包并解压后,在其`bin`目录下运行`elasticsearch`命令来启动服务。确保Elasticsearch服务正常运行,并且监听端口9200[^1]。 #### 修改application.properties 在Spring Boot项目中,需要配置Elasticsearch的相关信息。可以在`application.properties`文件中添加以下配置: ```properties spring.data.elasticsearch.repositories.enabled=true spring.data.elasticsearch.client.reactive.initial-cluster-nodes=localhost:9200 ``` 这些配置启用了Elasticsearch仓库,并指定了Elasticsearch集群节点地址。 #### 创建文档类 为了能够存储和检索数据,需要创建一个Java类来表示Elasticsearch中的文档。例如,可以创建一个名为`Document`的类: ```java import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; @Document(indexName = "documents") public class Document { @Id private String id; private String title; private String content; // Getters and Setters } ``` 此类使用了Spring Data Elasticsearch注解来定义索引名称,并标识了主键字段。 #### 创建资源库 接下来,需要创建一个接口来操作Elasticsearch中的数据。这个接口继承自`ElasticsearchRepository`: ```java import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface DocumentRepository extends ElasticsearchRepository<Document, String> { // 自定义查询方法 } ``` 通过此接口,可以方便地进行CRUD操作以及自定义查询方法[^1]。 #### 创建测试用例 为了验证集成是否成功,可以编写一个简单的测试用例来插入和检索数据: ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Optional; @SpringBootTest public class DocumentTest { @Autowired private DocumentRepository documentRepository; @Test public void testSaveAndRetrieve() { Document doc = new Document(); doc.setId("1"); doc.setTitle("Test Title"); doc.setContent("Test Content"); documentRepository.save(doc); Optional<Document> retrievedDoc = documentRepository.findById("1"); assert retrievedDoc.isPresent(); } } ``` 此测试用例验证了保存和检索文档的功能[^1]。 #### 实现全文搜索 为了实现全文搜索功能,可以在`DocumentRepository`中定义一个自定义查询方法: ```java import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.QueryBuilders; public interface DocumentRepository extends ElasticsearchRepository<Document, String> { default Iterable<Document> searchByContent(String text) { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("content", text)) .build(); return documentRepository.search(searchQuery); } } ``` 此方法使用Elasticsearch的`matchQuery`来进行全文搜索[^2]。 #### 分页查询 为了支持分页查询,可以在`DocumentRepository`中定义一个带有分页参数的方法: ```java import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.QueryBuilders; public interface DocumentRepository extends ElasticsearchRepository<Document, String> { default Iterable<Document> searchByContentWithPagination(String text, Pageable pageable) { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("content", text)) .withPageable(pageable) .build(); return documentRepository.search(searchQuery); } } ``` 此方法允许用户指定分页参数,以便处理大量数据时能够分批次获取结果[^2]。 #### 排序与聚合查询 对于排序和聚合查询,可以在`DocumentRepository`中定义相应的方法: ```java import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.QueryBuilders; import org.springframework.data.elasticsearch.core.query.SortBuilders; import org.springframework.data.elasticsearch.core.query.AggregationBuilders; public interface DocumentRepository extends ElasticsearchRepository<Document, String> { default Iterable<Document> searchByContentWithSorting(String text) { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("content", text)) .withSort(SortBuilders.fieldSort("title").order(SortOrder.ASC)) .build(); return documentRepository.search(searchQuery); } default void performAggregation() { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchAllQuery()) .addAggregation(AggregationBuilders.terms("titles").field("title.keyword")) .build(); // 处理聚合结果 } } ``` 这些方法分别实现了按标题排序和按标题进行聚合查询的功能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值