boolQueryBuilder.filter(QueryBuilders.termQuery("attr.category", "电视"));怎么查对象中的对象中的属性
时间: 2025-06-24 18:37:38 浏览: 8
### 使用 `boolQueryBuilder` 查询嵌套对象属性
在 Elasticsearch 中,当需要查询嵌套对象的属性时,可以使用 `Nested Query` 结合 `BoolQueryBuilder` 来完成复杂条件的构建。以下是一个完整的示例,展示如何通过 `termQuery` 查询嵌套字段 `attr.category`。
#### 定义实体类及其映射关系
假设我们有一个商品对象 `Product`,其中包含嵌套的对象 `Attr`,其结构如下所示:
```java
@Document(indexName = "products")
public class Product {
@Id
private String id;
private String title;
private String category;
private String brand;
private double price;
private String image;
@Field(type = FieldType.Nested)
private List<Attr> attrs; // 嵌套对象列表
// Getters and Setters
}
class Attr {
private String key;
private String value;
// Getters and Setters
}
```
在此定义中,`attrs` 被标记为嵌套类型 (`FieldType.Nested`),这意味着它可以作为独立的子文档存在[^2]。
---
#### 创建索引并准备测试数据
为了演示查询效果,我们需要先创建索引并向其中插入一些测试数据。可以通过以下代码实现:
```java
// 插入测试数据
List<Product> products = Arrays.asList(
new Product("1", "iPhone 13", "Electronics", "Apple", 999.0, "/img/iphone.jpg",
Collections.singletonList(new Attr("color", "black"))),
new Product("2", "Galaxy S21", "Electronics", "Samsung", 899.0, "/img/galaxy.jpg",
Collections.singletonList(new Attr("color", "white")))
);
productRepository.saveAll(products);
```
---
#### 编写 DSL 构建查询
要查询嵌套对象中的特定属性值(如 `attr.category`),需使用 `nested` 查询配合 `termQuery`。以下是具体的实现代码:
```java
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.NestedQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public class NestedQueryExample {
private final ElasticsearchRestTemplate elasticsearchRestTemplate;
private final ProductRepository productRepository;
public NestedQueryExample(ElasticsearchRestTemplate elasticsearchRestTemplate, ProductRepository productRepository) {
this.elasticsearchRestTemplate = elasticsearchRestTemplate;
this.productRepository = productRepository;
}
public void performNestedQuery() {
// Step 1: 构建内部 termQuery
BoolQueryBuilder innerQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("key", "color"))
.must(QueryBuilders.termQuery("value", "black"));
// Step 2: 将 termQuery 包裹在 nestedQuery 中
NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery(
"attrs", // 嵌套路径
innerQueryBuilder,
null // ScoreMode 可选,默认为 Avg
);
// Step 3: 执行查询
Iterable<Product> results = productRepository.search(nestedQueryBuilder);
// 输出结果
results.forEach(System.out::println);
}
}
```
---
#### 解析结果集
执行上述代码后,返回的结果将是所有满足条件的商品对象。例如,如果数据库中有多个商品记录,只有那些具有 `attr.key="color"` 并且 `attr.value="black"` 的商品会被匹配到。
---
### 关键点解释
1. **嵌套查询必要性**: 当前场景下,由于 `attrs` 是一个嵌套数组,因此无法直接使用普通的 `termQuery` 进行查询。必须借助 `nestedQuery` 明确指定嵌套路径[^2]。
2. **布尔逻辑组合**: 利用 `BoolQueryBuilder` 组合多个条件(如 `key=color` 和 `value=black`),从而实现精准筛选[^1]。
3. **ScoreMode 参数**: 在实际开发中可以根据需求调整评分模式(如 Max、Sum 等)。默认情况下采用平均分数计算方式。
---
###
阅读全文
相关推荐



















