使用Elasticearch Java API客户端创建带有列表的TermQuery

k7fdbhmy  于 2022-09-20  发布在  Java
关注(0)|答案(1)|浏览(149)

我正在尝试将一些Java High Level 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表达式来构造这些对象,但在我弄清楚如何使用新的客户端之前,我会尽可能地详细。

js5cn81o

js5cn81o1#

目前,使用STREAMS似乎是创建术语列表的最简单方式:

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

相关问题