【Elasticsearch】Filter search results`(筛选搜索结果

Elasticsearch筛选搜索结果功能详解

在Elasticsearch中,`Filter search results`(筛选搜索结果)是一种用于优化查询性能和调整搜索结果范围的功能。它允许用户在搜索过程中通过布尔查询(`bool query`)的`filter`子句或`post_filter`参数来精确控制返回的结果。以下是关于Elasticsearch中筛选搜索结果的详细说明:

---

1.布尔查询中的`filter`子句

布尔查询(`bool query`)是Elasticsearch中最常用的查询类型之一,它允许通过组合多个查询条件来构建复杂的查询逻辑。`filter`子句是布尔查询的一部分,用于对文档进行筛选,但与`must`或`should`子句不同,`filter`子句不会影响文档的打分(`_score`),仅用于过滤文档。

特点

• 不计算相关性分数:`filter`子句中的查询条件不会对文档的打分产生影响,因为它们的目的是筛选出符合条件的文档,而不是根据相关性排序。

• 缓存优化:由于`filter`子句不计算分数,Elasticsearch可以对这些过滤条件进行缓存,从而提高查询性能,尤其是在处理频繁使用的过滤条件时。

• 适用于精确匹配:`filter`子句通常用于精确匹配字段值,例如`term`、`terms`、`range`等查询类型。

示例

假设你有一个商品索引,包含品牌(`brand`)、颜色(`color`)和型号(`model`)等字段。如果用户只想查看红色的Gucci衬衫,可以使用以下查询:

```json

GET /shirts/_search

{

  "query": {

    "bool": {

      "filter": [

        { "term": { "color": "red" }},

   

### 使用 `spring-boot-starter-data-elasticsearch` 实现多参数查询 为了实现在 Spring Boot 应用程序中通过多个参数来查询 Elasticsearch 数据库,可以利用 `ElasticsearchRepository` 接口提供的方法定义功能。Spring Data Elasticsearch 支持多种方式构建复杂的查询逻辑。 #### 方法一:使用自定义查询语句 可以通过在接口的方法名上指定条件来进行简单的组合查询: ```java public interface ProductRepository extends ElasticsearchRepository<Product, String> { List<Product> findByTitleAndDescription(String title, String description); } ``` 这种方法适用于字段较少的情况,当涉及更多复杂条件时,则推荐采用更灵活的方式[^1]。 #### 方法二:使用 QueryDSL 或者 Criteria API 构建动态查询 对于更加复杂的场景,比如需要支持任意数量的不同类型的过滤器,应该考虑使用 QueryDSL 或者 Criteria API 来创建动态查询对象。这允许开发者根据实际传入的参数情况构造相应的布尔表达式树结构。 下面是一个例子展示如何使用 `CriteriaQuery` 进行多参数查询: ```java import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.CriteriaQuery; // ... @Autowired private ElasticsearchOperations operations; public Iterable<SearchHit<Product>> searchProductsByMultipleParams( Optional<String> title, Optional<Integer> minPrice, Optional<Integer> maxPrice) { var criteria = new Criteria(); if (title.isPresent()) { criteria.and("title").is(title.get()); } if (minPrice.isPresent() && maxPrice.isPresent()) { criteria.and("price").between(minPrice.get(), maxPrice.get()); } else if (minPrice.isPresent()) { criteria.and("price").greaterThanOrEqualTo(minPrice.get()); } else if (maxPrice.isPresent()) { criteria.and("price").lessThanOrEqualTo(maxPrice.get()); } return operations.search(new CriteriaQuery(criteria), Product.class); } ``` 这段代码展示了如何接收来自客户端请求中的可选参数,并据此建立一个或多个筛选条件[^2]。 #### 方法三:使用 Native Search 查询 如果上述两种方案都不能满足需求,还可以直接编写原生 JSON 形式的查询字符串并通过 `NativeSearchQueryBuilder` 提交给 ES 集群执行。这种方式提供了最大的灵活性,几乎能够覆盖所有的查询需求。 ```java import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.Query; // ... import static org.elasticsearch.index.query.QueryBuilders.*; // 创建查询 Query query = new NativeSearchQueryBuilder() .withQuery(boolQuery() .must(termQuery("field", "value")) .filter(rangeQuery("age").gte(0).lte(90)) ) .build(); Iterable<YourEntityClass> results = elasticsearchTemplate.queryForList(query, YourEntityClass.class); ``` 此片段说明了怎样组装包含布尔运算符以及范围限定在内的高级查询[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值