我正在尝试通过 Spring 和 Java(Elasticsearch 客户端)在 Elasticsearch 中编写查询。
查询有点像:
SELECT *** FROM elasticsearch_index
WHERE isActive = 1 AND
(
(store_code = 41 AND store_genre IN ('01', '03') )
OR (store_code = 40 AND store_genre IN ('02') )
OR (store_code = 42 AND store_genre IN ('05', '06') )
)
AND LATITUDE ...
AND LONGITUDE...
请注意,外括号内的参数是 Map<Integer, String[]>
,所以我会迭代 map
添加到 AND + OR 条件。
我尝试了等效的 Java 方法,但似乎不起作用:
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("isActive", 1));
BoolQueryBuilder orQuery = QueryBuilders.boolQuery();
for (Entry<Integer, String[]> entry : cvsDepoMapping.entrySet()) {
int key = entry.getKey();
String[] value = entry.getValue();
orQuery.must(QueryBuilders.matchQuery("storeCode", key));
orQuery.must(QueryBuilders.termsQuery("storeGenre", value)); // IN clause
boolQueryBuilder.should(orQuery);
}
但这也不起作用。我确信解决方案。 我正在努力寻找与上述条件等效的 Java 条件。
我正在使用:
- Spring Boot 2.1.1.RELEASE
- Elasticsearch 6.4.3
最佳答案
在您的 or 查询中,您需要为每个条目放置一个嵌套的 and 查询:
无需尝试运行它:
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("isActive", 1));
BoolQueryBuilder orQuery = QueryBuilders.boolQuery();
for (Entry<Integer, String[]> entry : cvsDepoMapping.entrySet()) {
BoolQueryBuilder storeQueryBuilder = QueryBuilders.boolQuery();
int key = entry.getKey();
String[] value = entry.getValue();
storeQueryBuilder.must(QueryBuilders.matchQuery("storeCode", key));
storeQueryBuilder.must(QueryBuilders.termsQuery("storeGenre", value)); // IN clause
orQuery.should(storeQueryBuilder);
}
boolQueryBuilder.must(orQuery);
关于java - 使用 AND/OR 组合的 Elasticsearch Java 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60940757/