/ 全文检索 public VuePage<Camera> fullTextSearch(String keyword,String townname, IPage<Camera> page) { // MultiMatchQueryBuilder builder = QueryBuilders.multiMatchQuery(keyword, "code", "name", "camerafullname", // "gbCode", "cameratypedesc", "address", "townname", "communityname").analyzer("ik_max_word"); MultiMatchQueryBuilder builder = QueryBuilders.multiMatchQuery(keyword, "code", "name", "gbCode", "cameratypedesc", "address", "communityname").analyzer("ik_max_word"); // 创建 BoolQueryBuilder,用于组合多个查询条件 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(builder); // 必须满足 MultiMatch 查询条件 if (StringUtils.isNotBlank(townname)) { boolQueryBuilder.must(QueryBuilders.termQuery("townname", townname)); // 添加 townname 等于固定值的条件 } 用ES搜索,要支持传入一个关键词搜索,同时要在这批数据的基础上满足街道等于传入的值,代码应该怎么写
时间: 2025-05-20 14:30:11 浏览: 22
### 实现带街道过滤条件的全文检索
以下是基于 Elasticsearch 和 Spring Boot 的代码示例,展示如何实现带有关键词搜索和按街道名称过滤功能的全文检索。
#### 1. 添加依赖项
在 `pom.xml` 文件中添加以下依赖项以集成 Elasticsearch:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
```
此部分来源于提供的参考资料[^3]。
#### 2. 创建实体类
定义一个表示文档结构的实体类。假设我们有一个包含地址信息的数据模型:
```java
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "address_index")
public class Address {
@Id
private String id;
private String street;
private String city;
private String description;
// Getters and Setters
}
```
以上代码片段展示了如何创建一个用于存储地址信息的实体类,并指定了索引名为 `address_index`[^1]。
#### 3. 配置 Elasticsearch 客户端
配置 Elasticsearch 客户端以便与服务交互:
```java
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration =
ClientConfiguration.builder()
.connectedTo("localhost:9200") // 替换为实际连接地址
.build();
return RestClients.create(clientConfiguration).rest();
}
}
```
该客户端配置允许应用程序通过 REST API 访问 Elasticsearch。
#### 4. 编写查询逻辑
编写一个方法来执行带有关键词搜索和街道过滤的查询操作:
```java
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SearchService {
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
public List<Address> searchByKeywordAndStreet(String keyword, String street, int page, int size) {
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("description", keyword)) // 关键词匹配描述字段
.filter(QueryBuilders.termQuery("street.keyword", street)); // 街道精确匹配
PageRequest pageable = PageRequest.of(page, size);
return elasticsearchRestTemplate.search(queryBuilder.build(), Address.class, pageable)
.map(SearchHit::getContent)
.toList();
}
}
```
上述代码实现了两个主要功能:
- 使用 `matchQuery` 对 `description` 字段进行全文检索。
- 使用 `termQuery` 对 `street` 字段进行精确匹配过滤[^1]。
#### 5. 测试查询接口
可以通过控制器暴露一个 HTTP 接口测试上述查询逻辑:
```java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class SearchController {
@Autowired
private SearchService searchService;
@GetMapping("/search")
public List<Address> search(
@RequestParam(required = false) String keyword,
@RequestParam(required = true) String street,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
return searchService.searchByKeywordAndStreet(keyword, street, page, size);
}
}
```
此接口接受三个参数:`keyword`(可选)、`street`(必填)以及分页参数 `page` 和 `size`[^1]。
---
###
阅读全文
相关推荐












