我正在尝试将一些 Java 高级 REST 客户端代码转换为新的 Elasticsearch Java API Client .
我想转换此查询,如果 id 等于 10 或 20,则检索内容。
SearchRequest searchRequest = new SearchRequest().indices(indexName);
List<Long> ids = new ArrayList<>();
ids.add(10l);
ids.add(20l);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("id", ids)));
searchRequest.source(searchSourceBuilder);
通过新的 Java API 客户端,我构建了类似的东西。
TermsQueryField termsQueryField = new TermsQueryField.Builder()
.value(/*Expects List<FieldValue>*/)
.build();
TermsQuery idTerms = new TermsQuery.Builder()
.field("id")
.terms(termsQueryField)
.build();
Query idQuery = new Query.Builder()
.terms(idTerms)
.build();
BoolQuery boolQuery = new BoolQuery.Builder()
.must(idQuery)
.build();
Query query = new Query.Builder()
.bool(boolQuery)
.build();
SearchRequest searchRequest = new SearchRequest.Builder()
.index(indexName)
.query(query)
.build();
我可以添加termQuery
单个值的选项,但我找不到将列表添加到查询的方法。
我遇到过TermsQuery
但这需要将值设置为 List<FieldValue>
所以这不是很有帮助。
注意:我知道我可以使用 lambda 表达式来构造这些对象,但在弄清楚如何使用新客户端之前,我会尝试尽可能详细。
最佳答案
使用流目前似乎是创建术语列表的最简单方法:
List<String> countries = List.of("afg", "aus");
TermsQueryField countryTerms = new TermsQueryField.Builder()
.value(countries.stream().map(FieldValue::of).toList())
.build();
SearchRequest sr = SearchRequest.of(s -> s
.query(q -> q
.bool(b -> b
.filter(mCtry -> mCtry
.bool(bCtry -> bCtry
.should(shdCtry -> shdCtry
.terms(tCtry -> tCtry
.field("country")
.terms(countryTerms)
)
)
)
)
)
)
);
关于java - 使用 Elasticsearch Java API 客户端创建带有列表的 TermQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72197344/