AND / ORの組み合わせでElasticsearchのJavaクエリ

アディV:

私は春と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[]>、私は反復処理となるので、mapAND + 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同等の条件を見つけるのに苦労しています。

私は使っている:

  • 春ブーツ2.1.1.RELEASE
  • Elasticsearch 6.4.3

すべてのヘルプは大歓迎です!!!!

PJMeisch:

あなたまたはクエリ内は、各エントリの入れ子になったし、クエリを配置する必要があります。

それを実行しようとせずに:

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

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=378872&siteId=1