我有這個非常簡單的 SQL 查詢:SELECT * FROM tableWHERE ((sphereMin>=-17 AND sphereMax<=5) OR sphereMin<=-17)AND((sphereMax<=5 AND sphereMax>=-17) OR sphereMax>=5)我必須使用高級 API 將該查詢轉換為 ES。這是相關代碼: SearchSourceBuilder searchBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = boolQuery(); BoolQueryBuilder booleanQuery1 = boolQuery(); BoolQueryBuilder subQuery1a = boolQuery(); booleanQuery1.must(subQuery1a); RangeQueryBuilder subQuery1b = null;subQuery1a.must(rangeQuery("sphereMin").gte(-17));subQuery1a.must(rangeQuery("sphereMax").lte(5));subQuery1b = rangeQuery("sphereMin").lte(-17);booleanQuery1.should(subQuery1b);BoolQueryBuilder booleanQuery2 = boolQuery();BoolQueryBuilder subQuery2a = boolQuery();booleanQuery2.must(subQuery2a);RangeQueryBuilder subQuery2b = null;subQuery2a.must(rangeQuery("sphereMax").gte(-17));subQuery2a.must(rangeQuery("sphereMax").lte(5));subQuery2b = rangeQuery("sphereMax").gte(5);booleanQuery2.should(subQuery2b);boolQueryBuilder.filter(booleanQuery1);boolQueryBuilder.filter(booleanQuery2);searchBuilder.query(boolQueryBuilder);SearchRequest searchRequest = Requests.searchRequest(indexName).allowPartialSearchResults(true) .source(searchBuilder).routing(routing);它看起來對我來說是正確的,但該查詢不會返回與 SQL 查詢相同的數據。我究竟做錯了什么?
2 回答

元芳怎么了
TA貢獻1798條經驗 獲得超7個贊
在你的情況下
booleanQuery1.must(subQuery1a);
應該是
booleanQuery1.should(subQuery1a);
也
booleanQuery2.must(subQuery2a);
也應該是
booleanQuery2.should(subQuery2a);
例子:
qb.should(a);
qb.should(b);
qb.should(c);
默認情況下,必須至少滿足以下條件之一:a OR b OR cwhile
qb.must(a);
qb.should(b);
表示 a必須匹配,而 b應該。

浮云間
TA貢獻1829條經驗 獲得超4個贊
((sphereMax<=5 AND sphereMax>=-17) OR sphereMax>=-17)
ubQuery2a.must(rangeQuery("sphereMax").gte(-17));
subQuery2a.must(rangeQuery("sphereMax").lte(5));
subQuery2b = rangeQuery("sphereMax").gte(5);
5 而不是 -17
;)
添加回答
舉報
0/150
提交
取消