Elasticsearch Java запрос с комбинацией AND / OR - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь написать запрос в Elasticsearch через Spring и Java (клиент 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

Любая помощь приветствуется !!!!

1 Ответ

2 голосов
/ 31 марта 2020

в вашем запросе или запросе вы должны поместить вложенный запрос для каждой записи:

, не пытаясь запустить его:

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