アディ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[]>
、私は反復処理となるので、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同等の条件を見つけるのに苦労しています。
私は使っている:
- 春ブーツ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);