簡體   English   中英

使用 AND/OR 組合的 Elasticsearch Java 查詢

[英]Elasticsearch Java query with combination of AND/OR

我正在嘗試通過 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

在您的 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM