【问题标题】:How to group documents by field in elastic search using spring如何使用弹簧在弹性搜索中按字段对文档进行分组
【发布时间】:2016-10-13 20:43:41
【问题描述】:

我有一个用户文档,其中包含包括 addressId 在内的各种字段。我想要具有不同 addressId 的用户列表。如果两个用户具有相同的 addressId,则返回任何一个用户并跳过另一个用户。

我正在尝试按 addressId 对用户进行分组,但它不起作用。

SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).
            addAggregation(AggregationBuilders.terms("addressId").field("addressId").size(1)).
            withPageable(new PageRequest(page, size)).build();

【问题讨论】:

    标签: elasticsearch spring-data-elasticsearch


    【解决方案1】:

    您需要添加一个大小为 1 的 top hitssubaggregation。这将在每个 addressId 字段中返回一个文档(即您的情况下的用户)。

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(boolQueryBuilder)
        .addAggregation(AggregationBuilders
        .terms("addressId")
        .field("addressId")
        .size(Integer.MAX_VALUE)
        .subaggregation(AggregationBuilders.topHits("justOneUserPerAddressId)
             .setSize(1)
        )
        .withPageable(new PageRequest(page, size)).build();
    

    【讨论】:

    • 仍然无法正常工作。什么是“justOneUserPerAddressId”??
    • 聚合必须有一个可以是任何字符串的“名称”。此名称用于检索搜索响应中的聚合结果。 justOneUserPerAddressId 是聚合名称。
    • 你能详细说明“不工作”吗?是例外吗?响应的json是什么?具体是什么不起作用?
    • 我得到所有具有相同 addressId 的用户,这意味着聚合不起作用
    • 您是否正在查看响应的聚合部分?它出现在所有搜索命中后的响应底部。
    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多