如何通过Java API实现Elasticsearch带OR逻辑的过滤查询组合
关于查询结构是否正确
你给出的DSL查询结构完全符合要求,逻辑完全匹配 country="DK" AND ((media="book" AND state="inactive") OR (media="ebook" AND state="active")) 的查询规则:
- 外层
bool.must固定了国家必须为DK的必选条件 - 第二个must子项的
bool.should对应OR逻辑,两个should分支分别对应两组AND条件,默认情况下should子句至少需要匹配1个,刚好满足需求。
Java API实现代码
实现逻辑和DSL结构一一对应即可,参考代码如下:
// 第一个OR分支:media是book且state是inactive BoolQueryBuilder bookInactiveQuery = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("media", "book")) .must(QueryBuilders.termQuery("state", "inactive")); // 第二个OR分支:media是ebook且state是active BoolQueryBuilder ebookActiveQuery = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("media", "ebook")) // 如果你的state字段存储值为大写ACTIVE,这里修改为对应大写即可 .must(QueryBuilders.termQuery("state", "active")); // 总查询构造 BoolQueryBuilder finalQuery = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("country", "DK")) .must(QueryBuilders.boolQuery() .should(bookInactiveQuery) .should(ebookActiveQuery) // 显式指定至少匹配一个should条件,避免后续调整查询结构时默认规则变化导致逻辑异常 .minimumShouldMatch(1) ); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(finalQuery) .build();
内容的提问来源于stack exchange,提问作者npeder
相关产品推荐
相关产品推荐

