繁体   English   中英

如何使用Java API计算基于多个字段值的Elastic Search文档?

[英]How to count Elastic Search documents based on multiple field values with the Java API?

我正在尝试根据document字段的值2来计算特定类型的文档数。

到目前为止,我可以使用以下方法计算文档数:

SearchResponse response = elasticClient.getClient().prepareSearch(Properties.get().getSearch().getAliasName())
        .setTypes(type)
        .setSize(0) // Don't return any documents, we don't need them.
        .get();

SearchHits hits = response.getHits();
return (int) hits.getTotalHits();

返回正确的文档总数。

我还可以使用以下方法搜索特定文档:

    searchResponse = elasticClient.getClient()
            .prepareSearch(index)
            .setSearchType(SearchType.QUERY_THEN_FETCH)
            .setQuery(QueryBuilders.prefixQuery(field_name, field_value))
            .setFetchSource(true)
            .setSize(10000)
            .setTypes(type)
            .addSort(builder.order(SortOrder.DESC))
            .get();

这也将返回文档。

我尝试使用以下方法基于2个字段值进行计数:

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.prefixQuery(field_1, value_1));
queryBuilder.must(QueryBuilders.prefixQuery(field_2, value_2));
SearchRequestBuilder searchBuilder = elasticClient.getClient().prepareSearch(index)
        .setQuery(queryBuilder)
        .setTypes(type)
        .setSize(0);

但这始终返回0。

如何使用Java API根据2个字段值正确计数文档?

通过检查查询,您不会将两个值一起传递。 您首先要传递对field_1的查询,然后用对field_2的查询覆盖它。 因此,在将变量传递给客户端QueryBuilders.prefixQuery(field_2, value_2)变量queryBuilder仅具有查询: QueryBuilders.prefixQuery(field_2, value_2)

在Elasticsearch查询DSL中, must对象是一系列查询,其行为类似于SQL where子句中的AND 因此must列表中的所有查询都must匹配。 要将两个查询都包括在内, must执行以下操作:

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must().add(QueryBuilders.prefixQuery(field_1, value_1));
queryBuilder.must().add(QueryBuilders.prefixQuery(field_2, value_2));

至于计数, size = 0应该可以解决问题。 您使用哪种弹性搜索客户端?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM