Elasticsearch Java:如何用should子句实现按年龄筛选图书的查询
Elasticsearch 按用户年龄筛选图书查询实现方案
实现思路
将需求中的四个筛选条件转化为BoolQueryBuilder的should子句,只要满足任意一个条件即可匹配。通过设置minimumShouldMatch(1)确保至少匹配一个子句,最终将该查询作为根查询的must条件。
代码实现
private void addSearchByUserAge(Integer inputAge, BoolQueryBuilder rootQuery) { BoolQueryBuilder ageFilterQuery = boolQuery(); ageFilterQuery.minimumShouldMatch(1); // 条件1:输入年龄处于[minAge, maxAge]区间内(同时存在minAge和maxAge) BoolQueryBuilder inRangeQuery = boolQuery() .must(rangeQuery("minAge").lte(inputAge)) .must(rangeQuery("maxAge").gte(inputAge)); ageFilterQuery.should(inRangeQuery); // 条件2:无minAge和maxAge属性 BoolQueryBuilder noAgeAttrQuery = boolQuery() .mustNot(existsQuery("minAge")) .mustNot(existsQuery("maxAge")); ageFilterQuery.should(noAgeAttrQuery); // 条件3:无minAge但maxAge ≥ 输入年龄 BoolQueryBuilder noMinAgeQuery = boolQuery() .mustNot(existsQuery("minAge")) .must(rangeQuery("maxAge").gte(inputAge)); ageFilterQuery.should(noMinAgeQuery); // 条件4:无maxAge但minAge ≤ 输入年龄 BoolQueryBuilder noMaxAgeQuery = boolQuery() .mustNot(existsQuery("maxAge")) .must(rangeQuery("minAge").lte(inputAge)); ageFilterQuery.should(noMaxAgeQuery); rootQuery.must(ageFilterQuery); }
逻辑验证(输入年龄=5时)
对应给定数据集,各图书匹配情况:
- Book1:满足条件1(3≤5≤8)→ 匹配
- Book2:不满足任何条件(6>5)→ 不匹配
- Book3:满足条件1(3≤5≤5)→ 匹配
- Book4:满足条件1(5≤5≤8)→ 匹配
- Book5:满足条件2 → 匹配
- Book6:满足条件4(无maxAge,3≤5)→ 匹配
- Book7:不满足任何条件(6>5)→ 不匹配
- Book8:满足条件3(无minAge,6≥5)→ 匹配
- Book9:不满足任何条件(4<5)→ 不匹配
最终匹配结果为Book1、3、4、5、6、8,与需求一致。
内容的提问来源于stack exchange,提问作者Sandeep Nair
相关产品推荐
相关产品推荐

