java - 使用 AND/OR 组合的 Elasticsearch Java 查询

标签 java elasticsearch elasticsearch-dsl

我正在尝试通过 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/

相关文章:

java - 接口(interface)和对象继承

elasticsearch - 在 Elasticsearch 中选择一行

elasticsearch - Elasticsearch日期直方图聚合,不考虑年份

elasticsearch - ElasticSearch:如果文档中存在字段,则在script_score函数内执行余弦相似度

python - 如何在python的elasticsearch中索引大型json响应?使用Elasticsearch DSL

java - 使用 JPQL order by 包含空值

java - 比较两个 Canvas 的差异

java - 如何使用本地 tomcat 版本与 maven

elasticsearch - 多个并使用子请求进行查询。 Elasticsearch

search - Elasticsearch术语建议者返回词干结果