java - 使用 Elasticsearch Java API 客户端创建带有列表的 TermQuery

标签 java elasticsearch elasticsearch-java-api

我正在尝试将一些 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/

相关文章:

maven - 由于elasticSearch客户端中的记录器依赖错误,无法与ElasticSearch 7.3.0连接

elasticsearch - ES Java动态将关键过滤器添加到AggregationBuilder

java - Java分号错误的二次公式

elasticsearch - 如何在ElasticSearch DeleteByQuery Java API中添加查询字符串参数?

java - 获取 StringArray 项目名称

elasticsearch - 在嵌套对象中进行 Elasticsearch 分析

python - 如何使用 Python API 在 Elastic Search 中批量索引

elasticsearch - 启动 Log Stash 时出错 需要 [\\t\\r\\n] 之一

java - 外部 Jar 对于包下的类不可见

java - View.getId 和 R.id.viewLabel 返回不同的值