Elasticsearch: collapse 去重

官方文档传送门

1、 collapse

collapse 可以将搜索结果按照指定的 field 去重。如果在一次 DSL query 中,collapsesort 同时存在时,DSL 的执行顺序是 select -> collapse -> sort

2、 使用场景

根据关键词搜索 spu_id, 但文档是 SKU,根据 SKU 的名称关键词搜索 spu_id。一个 SPU 通常都有多个 SKU,如果不对 spu_id 进行去重,那么 spu_id 将会有很多的重复。

DSL demo

{
    "query": {
        "match": {
            "desc": "搜索"
        }
    },
    "from": 0,
    "size": 4,
    "collapse": {
        "field": "spu_id"
    },
    "_source": {
        "includes": [
            "spu_id"
        ]
    }
}

response

{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 18,
            "relation": "eq"
        },
        "max_score": null,
        "hits": [
            {
                "_index": "xxx",
                "_type": "_doc",
                "_id": "xxx",
                "_score": 19.782768,
                "_routing": "xxx",
                "_source": {
                    "spu_id": xxx
                },
                "fields": {
                    "spu_id": [
                        "xxx"
                    ]
                }
            },
            {
                "_index": "xxx",
                "_type": "_doc",
                "_id": "xxx",
                "_score": 18.0652,
                "_routing": "xxx",
                "_source": {
                    "spu_id": xxx
                },
                "fields": {
                    "spu_id": [
                        "xxx"
                    ]
                }
            }
        ]
    }
}
3、 collapse 的优缺点

优点:性能明显

缺点

分页查询时不知道去重后的 spu_id 的总数;
不能和 scroll 组合进行分页查询;

elasticsearch
elasticsearch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Elasticsearch6中,可以使用terms聚合实现去重操作。下面是一个Java示例代码: ```java SearchRequest searchRequest = new SearchRequest("your_index"); // 指定索引名称 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); // 只需要聚合结果,不需要返回文档 TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("duplicate_count").field("your_field"); // 指定需要去重的字段 searchSourceBuilder.aggregation(aggregationBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); Terms terms = searchResponse.getAggregations().get("duplicate_count"); List<? extends Terms.Bucket> buckets = terms.getBuckets(); for (Terms.Bucket bucket : buckets) { String key = bucket.getKeyAsString(); // 去重后的值 long docCount = bucket.getDocCount(); // 该值出现的文档数量 // TODO: 处理聚合结果 } ``` 其中,`your_index`为需要进行去重操作的索引名称,`your_field`为需要去重的字段名称,可以根据实际情况进行修改。在处理聚合结果时,可以根据需要进行进一步的处理。 ### 回答2: 在使用Java操作Elasticsearch6实现去重操作时,我们可以通过以下步骤实现: 1. 创建Elasticsearch的连接和初始化客户端。 例如,我们可以使用以下代码创建和初始化客户端: ```java RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); ``` 2. 使用Elasticsearch的搜索API进行去重操作。 可以使用Elasticsearch的搜索API来查询需要去重的字段,并通过聚合操作筛选出唯一的值。具体步骤如下: ```java // 创建一个SearchRequest对象 SearchRequest searchRequest = new SearchRequest("your_index_name"); // 创建一个SearchSourceBuilder对象,并设置聚合操作 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.aggregation(AggregationBuilders .terms("unique_values").field("your_field_name").size(10000)); // 将SearchSourceBuilder对象设置到SearchRequest中 searchRequest.source(sourceBuilder); // 执行搜索操作 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); // 从响应中获取聚合结果 Terms agg = response.getAggregations().get("unique_values"); // 遍历聚合结果并输出唯一值 for (Terms.Bucket bucket : agg.getBuckets()) { System.out.println("Unique value: " + bucket.getKeyAsString()); } ``` 在上述代码中,我们创建了一个SearchRequest对象,并指定了需要进行去重的字段。然后,我们创建了一个SearchSourceBuilder对象,并使用aggregation方法设置了聚合操作。最后,我们执行搜索操作并从响应中获取聚合结果。 以上就是使用Java操作Elasticsearch6实现去重操作的简要步骤。根据具体需求,我们可以通过调整代码来实现更复杂的去重逻辑。 ### 回答3: Java操作Elasticsearch6实现去重操作主要依赖于Elasticsearch Java High Level REST Client,以下是一个简单实现的步骤: 1. 首先,我们需要创建一个Elasticsearch的客户端连接: ```java RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); ``` 2. 接下来,我们可以使用Search API来实现去重操作。首先,我们需要创建一个SearchRequest对象并设置索引名称和搜索条件: ```java SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); // 设置查询条件 searchSourceBuilder.aggregation(AggregationBuilders .terms("deduplication") .field("field_name") .size(10000)); // 设置去重字段和聚合大小 searchRequest.source(searchSourceBuilder); ``` 3. 然后,我们可以发送搜索请求来获得去重后的结果: ```java SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); Terms aggregation = searchResponse.getAggregations().get("deduplication"); for (Terms.Bucket bucket : aggregation.getBuckets()) { String fieldValue = bucket.getKey().toString(); System.out.println("Deduplicated Field Value: " + fieldValue); } ``` 在上述代码中,我们通过聚合操作(aggregation)中的terms功能来实现去重。使用聚合将结果按照指定字段(field_name)分组,然后获取每个分组的聚合结果(deduplication)。 以上是使用Java操作Elasticsearch6实现去重操作的简单示例。请注意,具体的实现可能根据实际需求有所调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值