SpringBoot中进行elasticSearch查询,使用QueryBuilders构建各类条件查询

本文介绍了Elasticsearch中进行全文检索的各种查询方式,包括全量查询、单个字段精确匹配、多字段匹配、模糊匹配、布尔复合查询、范围查询以及判空查询。同时,还展示了如何实现分页查询。内容详细且实用,适用于Elasticsearch的查询操作。

查询所有

//搜索全部文档
QueryBuilder queryBuilder =
QueryBuilders.matchAllQuery();

查询单个,等于/eq

//单个匹配,搜索name为li的文档
QueryBuilder queryBuilder =
QueryBuilders.matchQuery("name", "li");

查询多个字段匹配某一个值

//搜索name中或nickname中包含有li的文档(必须与li一致)
QueryBuilder queryBuilder =
QueryBuilders.multiMatchQuery("li","name", "nickname");

模糊匹配

//搜索名字中含有li文档(name中只要包含li即可)
WildcardQueryBuilder queryBuilder =
QueryBuilders.wildcardQuery("name","*li*");

BoolQueryBuilder复合查询

BoolQueryBuilder对象使用must方法build,多个and使用多个must

WildcardQueryBuilder queryBuilder1 = QueryBuilders.matchQuery("name", "li");
WildcardQueryBuilder queryBuilder2 = QueryBuilders.matchQuery("id", "1");

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//查询名字是LI和id是1的所有数据
boolQueryBuilder.must(queryBuilder1);
boolQueryBuilder.must(queryBuilder2);

BoolQueryBuilder对象使用should方法build,多个or使用多个should使用

WildcardQueryBuilder queryBuilder1 = QueryBuilders.matchQuery("name", "li");
WildcardQueryBuilder queryBuilder2 = QueryBuilders.matchQuery("id", "1");

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//查询名字是LI或id是1的所有数据
boolQueryBuilder.should(queryBuilder1);
boolQueryBuilder.should(queryBuilder2);

must:必须满足的条件

should:非必须满足的条件

minimumShouldMatch(1):至少要满足一个 should 条件

等值查询

BoolQueryBuilder queryBuilder =
QueryBuilders.boolQuery().must(QueryBuilders.termQuery("name", "小李"));

范围查询

BoolQueryBuilder queryBuilder =
QueryBuilders.rangeQuery("age").gte(18).lte(50);

判空查询

BoolQueryBuilder queryBuilder =
QueryBuilders.boolQuery()
.must(QueryBuilders.existsQuery("name"))
.mustNot(QueryBuilders.existsQuery("tag"));
//查询name有值,tag不存在值

分页查询

SearchResponse response =
this.transportClient
.prepareSearch(index)
.setTypes(type)
.setQuery(queryBuilder)
.setFrom(offset)
.setSize(rows)
.setExplain(false)
.execute()
.actionGet();

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://www.cnblogs.com/lingyejun/p/17557467.html

<think> 我们首先需要明确,在Spring Boot项目中使用Elasticsearch(ES)进行查询,通常有两种主要方式: 1. 使用Spring Data Elasticsearch(这是Spring Data项目的一部分)提供的Repository抽象。 2. 直接使用Elasticsearch的RestHighLevelClient(在较新版本中,官方推荐使用新的Java客户端,但Spring Data Elasticsearch目前主要还是基于RestHighLevelClient,不过从Spring Data Elasticsearch 4.0开始,支持使用新的Java客户端,但这里我们以常用的方式为例)。 由于问题中提到了是新手学习,我们将介绍使用Spring Data Elasticsearch的方式,因为它更简单,更符合Spring Boot的风格。 步骤: 1. 添加依赖 2. 配置Elasticsearch 3. 创建实体类(映射ES的索引) 4. 创建Repository接口 5. 编写查询方法或使用自定义查询 下面我们详细说明每一步。 1. 添加依赖 在pom.xml中添加Spring Data Elasticsearch的依赖。注意版本要与你的Spring Boot版本兼容。 例如,对于Spring Boot 2.3.x,可以添加: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 配置Elasticsearch 在application.properties或application.yml中配置Elasticsearch的连接信息。 例如,在application.properties中: ```properties spring.elasticsearch.rest.uris=http://localhost:9200 # 如果集群有多个节点,可以配置多个,用逗号分隔 # 如果你的ES需要用户名密码,可以配置 spring.elasticsearch.rest.username=your-username spring.elasticsearch.rest.password=your-password ``` 3. 创建实体类 使用@Document注解指定索引名称,使用@Id指定文档ID,使用@Field指定字段映射(如类型、分析器等)。 例如: ```java import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Document(indexName = "book") public class Book { @Id private String id; @Field(type = FieldType.Text) private String title; @Field(type = FieldType.Text) private String author; // 省略构造方法、getter和setter } ``` 4. 创建Repository接口 创建一个接口,继承ElasticsearchRepository,该接口提供了一些基本的CRUD方法和查询方法。 例如: ```java import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface BookRepository extends ElasticsearchRepository<Book, String> { // 可以根据方法名自动生成查询 List<Book> findByTitle(String title); // 也可以使用@Query注解自定义查询 @Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}") List<Book> findByTitleCustom(String title); } ``` 5. 使用Repository进行查询 在Service或Controller中注入BookRepository,然后调用其方法。 例如: ```java @Service public class BookService { @Autowired private BookRepository bookRepository; public List<Book> searchByTitle(String title) { return bookRepository.findByTitle(title); } } ``` 除了使用Spring Data提供的方法命名约定自动生成查询,还可以使用ElasticsearchTemplate(或RestTemplate)进行更复杂的操作。 另外,如果查询条件复杂,可以自定义Repository实现,具体步骤: - 定义一个自定义接口,例如CustomBookRepository,其中声明自定义方法。 - 创建一个实现类,命名为CustomBookRepositoryImpl,实现自定义接口。 - 让BookRepository接口同时继承CustomBookRepository。 在实现类中,可以使用ElasticsearchOperations(原ElasticsearchTemplate)来构建查询。 示例自定义实现: ```java public class CustomBookRepositoryImpl implements CustomBookRepository { private final ElasticsearchOperations elasticsearchOperations; public CustomBookRepositoryImpl(ElasticsearchOperations elasticsearchOperations) { this.elasticsearchOperations = elasticsearchOperations; } @Override public List<Book> customSearch(String searchTerm) { // 构建查询 Query query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("title", searchTerm)) .build(); return elasticsearchOperations.search(query, Book.class).stream() .map(SearchHit::getContent) .collect(Collectors.toList()); } } ``` 然后,修改BookRepository: ```java public interface BookRepository extends ElasticsearchRepository<Book, String>, CustomBookRepository { // ... } ``` 注意:在Spring Data中,自定义实现类的命名规则是:接口名+Impl(默认),也可以通过配置修改。 以上就是Spring Boot中集成Elasticsearch进行查询的基本步骤。 解释: 使用Spring Data Elasticsearch可以简化与Elasticsearch的交互,它提供了类似于Spring Data JPA的编程模型。通过定义Repository接口,我们可以轻松地执行各种查询,而无需编写大量的样板代码。对于复杂的查询,我们可以通过自定义接口和实现类,使用ElasticsearchOperations来构建查询。 最后,注意版本兼容性问题,Spring Data Elasticsearch的版本需要与Elasticsearch服务器版本匹配,否则可能出现不兼容的情况。 相关问题: §§相关问题§§: 1. 如何配置Spring Boot项目以连接多个Elasticsearch节点? 2. 在Spring Data Elasticsearch中,如何实现复杂查询(例如布尔查询、范围查询)? 3. 如何更新Elasticsearch中的文档? 4. 如何处理Elasticsearch的版本兼容性问题? </think>### 在Spring Boot使用Elasticsearch进行查询的步骤 #### 1. **添加依赖** 在`pom.xml`中添加Spring Data Elasticsearch依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` #### 2. **配置Elasticsearch连接** 在`application.properties`中配置ES地址: ```properties spring.elasticsearch.rest.uris=http://localhost:9200 # 若需要认证 spring.elasticsearch.rest.username=your_username spring.elasticsearch.rest.password=your_password ``` #### 3. **创建实体类映射索引** 使用注解定义ES索引结构: ```java import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Document(indexName = "books") // 索引名称 public class Book { @Id private String id; @Field(type = FieldType.Text, analyzer = "ik_max_word") // 使用中文分词器 private String title; @Field(type = FieldType.Keyword) // 精确匹配字段 private String author; @Field(type = FieldType.Integer) private Integer publishYear; // 构造方法/getter/setter } ``` #### 4. **创建Repository接口** 继承`ElasticsearchRepository`定义查询方法: ```java import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import java.util.List; public interface BookRepository extends ElasticsearchRepository<Book, String> { // 1. 方法名自动推导查询 List<Book> findByAuthor(String author); // 2. 范围查询 List<Book> findByPublishYearBetween(Integer startYear, Integer endYear); // 3. 自定义DSL查询 @Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}") List<Book> customSearch(String keyword); } ``` #### 5. **复杂查询示例(使用RestHighLevelClient)** 对于更复杂的查询,直接使用ES客户端: ```java import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; public class BookService { @Autowired private RestHighLevelClient esClient; public List<Book> searchBooks(String keyword, int minYear) throws IOException { SearchRequest request = new SearchRequest("books"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 组合查询:标题包含关键词 + 出版年份大于minYear sourceBuilder.query(QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("title", keyword)) .filter(QueryBuilders.rangeQuery("publishYear").gte(minYear)) ); request.source(sourceBuilder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); // 将搜索结果转换为Book列表(需实现解析逻辑) return parseSearchResponse(response); } } ``` #### 6. **调用查询(Controller示例)** ```java @RestController @RequestMapping("/books") public class BookController { @Autowired private BookRepository bookRepository; @GetMapping("/search") public List<Book> search(@RequestParam String author) { return bookRepository.findByAuthor(author); } } ``` --- ### 关键点解析 1. **依赖问题** - 确保Spring Boot版本与ES版本兼容(官方兼容矩阵:https://spring.io/projects/spring-data-elasticsearch) - 生产环境推荐使用与ES服务端匹配的客户端版本 2. **映射机制** - `@Document`定义索引配置(如分片数、副本数) - `@Field`控制字段类型(Text支持分词,Keyword用于精确匹配) 3. **查询类型选择** - **简单查询**:使用方法名自动推导(如`findByTitleAndAuthor`) - **中等复杂度**:使用`@Query`注解写DSL - **复杂查询**:直接通过`RestHighLevelClient`构建 4. **性能注意** - 避免深度分页(使用`search_after`代替`from/size`) - 对文本字段使用`keyword`类型进行精确匹配过滤 --- ### 常见问题解决方案 **问题1:无法连接ES** - 检查`spring.elasticsearch.rest.uris`格式(需包含`http://`) - 使用`curl http://localhost:9200`验证ES服务状态 **问题2:字段映射错误** - 删除旧索引让Spring Boot自动创建新映射 - 手动更新映射:`PUT /books/_mapping { "properties": {...} }` **问题3:中文分词失效** - 安装IK分词器到ES插件目录 - 字段注解指定分词器:`@Field(type=FieldType.Text, analyzer="ik_max_word")` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值