【问题标题】:Elasticsearch Java query with combination of AND/OR使用 AND/OR 组合的 Elasticsearch Java 查询
【发布时间】:2020-07-11 10:11:09
【问题描述】:

我正在尝试通过 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
  • 弹性搜索 6.4.3

感谢任何帮助!!!!

【问题讨论】:

  • 你能在 elasticsearch dsl 中构造查询吗?
  • @OpsterESNinjaNishant 我对弹性搜索很陌生,所以目前只尝试使用 Java。我对 elasticseacrch DSL 以及这种情况如何适应不太有信心!

标签: java elasticsearch elasticsearch-dsl


【解决方案1】:

在您的 or 查询中,您需要为每个条目放置一个嵌套和查询:

无需尝试运行它:

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);

【讨论】:

  • 嗨,但我没有看到任何“应该”。满足 OR 的要求就足够了吗?
  • 哎呀,修复了。我不应该在一大早回答这些问题。 storeQueryBuilders 与 should 添加到 orQuery
  • 谢谢!我得到了这个想法并为自己添加了它,并且效果很好。我正在验证查询!感谢您的帮助!
  • 很高兴听到。如果有帮助,请采纳答案
  • @AdiV 除了给出的答案,我建议您了解bool query 的工作原理以及combine queries 的工作原理。
猜你喜欢
  • 2018-06-03
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多