fingerprint filter 插件——Elasticsearch 去重必备利器

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 1、实战问题问题1:es 中 scroll 游标不能与 collapse 共用,有什么办法可以实现 collapse 的效果?问题2:采集互联网数据有重复数据写入 Elasticsearch,如何去重后放到另外索引?

2、排查思路

2.1 Elasticsearch 去重的几种方式

之前我有文章解读:Elasticsearch6.X 去重详解


方式一:terms 指定字段聚合 + top_hits 子聚合。


方式二:collapse 折叠去重。


拿个实战列子看一下:


当下正值高考出成绩,我们拿新闻事件信息作为数据来源。


如下文档_id:1、_id:2、_id:3 是一模一样的数据;_id: 4 是独立数据。


也就是说:去重后数据分两组,一组:[1,2,3]; 另外一组:[4]。


PUT news/_bulk

{"index":{"_id":1}}

{"title":"南开录取通知书亮相,附赠嘉兴莲花种子、一封特殊的信","cont":"今天,南开大学晒出建党百年特别版录取通知书。","url":"https://baijiahao.baidu.com/s?id=1703334751082094750&wfr=spider&for=pc","publish_time":"2021-06-23 13:36"}

{"index":{"_id":2}}

{"title":"南开录取通知书亮相,附赠嘉兴莲花种子、一封特殊的信","cont":"今天,南开大学晒出建党百年特别版录取通知书。","url":"https://baijiahao.baidu.com/s?id=1703334751082094750&wfr=spider&for=pc","publish_time":"2021-06-23 13:36"}

{"index":{"_id":3}}

{"title":"南开录取通知书亮相,附赠嘉兴莲花种子、一封特殊的信","cont":"今天,南开大学晒出建党百年特别版录取通知书。","url":"https://baijiahao.baidu.com/s?id=1703334751082094750&wfr=spider&for=pc","publish_time":"2021-06-23 13:36"}

{"index":{"_id":4}}

{"title":"建党百年特别版!南开大学录取通知书送两粒嘉兴莲花种子","cont":"@南开大学 6月23日消息,建党百年特别版南开大学录取通知书揭秘!","url":"https://www.163.com/dy/article/GD69KNIR0514R9P4.html","publish_time":"2021-06-23 13:25:00"}

# top_hits 子聚合去重

GET news/_search

{

 "query": {

   "match_all": {}

 },

 "aggs": {

   "type": {

     "terms": {

       "field": "title.keyword",

       "size": 10

     },

     "aggs": {

       "title_top": {

         "top_hits": {

           "_source": {

             "includes": [

               "title"

             ]

           },

           "sort": [

             {

               "title.keyword": {

                 "order": "desc"

               }

             }

           ],

           "size": 1

         }

       }

     }

   }

 },

 "size": 0

}

# collapse 去重

GET news/_search

{

 "query": {

   "match_all": {}

 },

 "collapse": {

   "field": "title.keyword"

 }

}

2.2 Elasticsearch scroll 不支持 collapse 确认

源码确认:

image.png

的确不支持。

2.3 考虑新方案

原有的方案和思路都在 scroll 导出数据方面行不通的,只能考虑新的思路了。

这个问题扩展一下,如何让数据写入 Elasticsearch 前去重呢?

说一下我的 Mysql 到 Elasticsearch 同步实战思路:

image.png

数据源:爬虫采集互联网数据(由于是采集数据,难免会有转载等重复数据)。


源数据存储:Mysql。


如何界定重复?基于:发文标题、发文时间、发文正文内容、发文url 组成字段的MD5值作为去重标记。


数据由 Mysql 同步到 Elasticsearch 如何实现去重?


其实也很简单,一旦有了MD5值,将MD5值作为写入 Elasticsearch 的文档 id,就可以完成 Mysql 数据到 Elasticsearch 的去重同步处理。


而下面要着重讲解的 logstash fingerprint filter 插件实现数据去重处理,就是基于刚才的思路实现的。


3、logstash fingerprint filter 插件介绍

fingerprint:中文直译为"指纹"。

https://www.elastic.co/guide/en/logstash/current/plugins-filters-fingerprint.html


3.1 fingerprint filter 插件版本

官方文档强调:


Versioned plugin documentation is not available for plugins released prior to Logstash 6.0.

这是 Logstash 6.X 之后才有的功能。


3.2 fingerprint filter 插件用途

fingerprint filter 插件是 logstash filter 强大环节中的 58 个核心插件的中间一个插件。

image.png

其核心功能:创建一个或多个字段的一致哈希(指纹)并将结果存储在新字段中。


当文档插入 Elasticsearch 时,可以使用此插件创建一致的文档 ID。


也就是说,如果两个或者后续多个文档的指纹一致,则写入 Elasticsearch 的 _id 一致(前提 ES ID是明确指定使用指纹),所以相同指纹数据写入 Elasticsearch 会覆盖,间接实现了写入去重。


下面我们先实战,再根据实战讲解核心参数意思,大家理解可能更顺畅、通透一些。


4、logstash fingerprint filter 去重实战

4.1 同步脚本

写在配置文件:logstash_print.conf 中(配置文件名称自己定义就可以)。


input {

 # Read all documents from Elasticsearch

 elasticsearch {

   hosts => "172.21.0.14:19022"

   index => "news"

   query => '{ "sort": [ "_doc" ] }'

 }

}

filter {

   fingerprint {

       key => "1234ABCD"

       method => "SHA256"

       source => ["title", "cont", "url", "publish_time"]

       target => "[@metadata][generated_id]"

       concatenate_sources => true

   }

}

output {

   stdout { codec => dots }

   elasticsearch {

       hosts => "172.21.0.14:19022"

       index => "news_after_fingerprint"

       document_id => "%{[@metadata][generated_id]}"

   }

}

4.1.1 脚本讲解

logstash 脚本大家就记住三段论。


第一:input,代表输入(读取端),本实例自然是基于 Elasticsearch 读。


第二:filter,代表中间处理,那就是指纹处理部分。


第三:output,代表输出(写入端),本实例还是写入 Elasticsearch,只不过会写入新的索引 news_after_fingerprint。


4.1.2 filter 环节核心参数讲解

key => "1234ABCD",代表当前指纹的唯一值。


method => "SHA256",指纹生成方式。


source => ["title", "cont", "url", "publish_time"],生成指纹的基础字段名称。


target => "[@metadata][generated_id]":将存储生成的指纹的字段的名称,后面output 环节会使用。该字段的任何当前内容都将被覆盖。


concatenate_sources => true


如果为true 且 method 不是 UUID 或 PUNCTUATION 时,插件会在进行指纹计算之前将 source 选项中给出的所有字段的名称和值连接成一个字符串。


如果给出 false 和多个源字段,则目标字段将是最后一个源字段的单个指纹。


4.2 同步实操

image.png

4.3 成功标记

image.png

5、小结

fingerprint filter 插件是基于现实业务问题而开发的,解决写入去重或者导出去重的业务痛点。我们再看开头两个问题。


问题1 答案:不用 collapse,用 fingerprint filter 插件将数据转存为另外索引,然后 scroll 遍历输出就可以。


问题2 答案:用 fingerprint filter 插件将数据转存为另外索引即可。


fingerprint filter 插件较开头两种去重方案优势体现在:


能将去重后的数据独立存储为一个索引,且无需额外操作。


方便业务单独处理数据。


欢迎留言交流一下您的去重思考。


参考

https://alexmarquardt.com/tag/deduplicate/

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
6月前
|
人工智能 数据可视化 Java
ElasticSearch安装、插件介绍及Kibana的安装与使用详解
ElasticSearch安装、插件介绍及Kibana的安装与使用详解
ElasticSearch安装、插件介绍及Kibana的安装与使用详解
|
4月前
|
安全 大数据 Java
elasticsearch|大数据|低版本的elasticsearch集群的官方安全插件x-pack的详解
elasticsearch|大数据|低版本的elasticsearch集群的官方安全插件x-pack的详解
53 0
|
9月前
|
安全 Java 关系型数据库
elasticsearch安装dynamic-synonym插件
如何快速掌握Elasticsearch8.x同义词插件的使用,本文将层层深入带你从0到1理解ES的插件开发
elasticsearch安装dynamic-synonym插件
elasticsearch hanlp 插件安装操作
简要简述elasticsearch hanlp插件的基本安装操作
elasticsearch hanlp 插件安装操作
|
8月前
|
自然语言处理 Java Maven
Elasticsearch系列——安装中文分词插件elasticsearch-analysis-ik
Elasticsearch系列——安装中文分词插件elasticsearch-analysis-ik
|
4月前
|
自然语言处理 Java 关系型数据库
Elasticsearch【环境搭建 01】elasticsearch-6.4.3 单机版不能以root用户运行es 及 max_map_count 问题解决(含 安装包+分词插件 云盘资源)
Elasticsearch【环境搭建 01】elasticsearch-6.4.3 单机版不能以root用户运行es 及 max_map_count 问题解决(含 安装包+分词插件 云盘资源)
31 0
|
8月前
|
SQL AliSQL API
阿里云ElasticSearch安装开源插件实践
阿里云ElasticSearch安装开源插件实践,包含较为常用的NLPchina/elasticsearch-sql与medcl/elasticsearch-analysis-stconvert两个插件的安装、使用测试及同类插件的差异对比
|
8月前
|
存储 自然语言处理 搜索推荐
Elasticsearch插件管理(ik分词器、附件文本抽取插件)
Elasticsearch插件管理(ik分词器、附件文本抽取插件)
188 0
|
11月前
|
缓存 自然语言处理 监控
白话Elasticsearch52-深入聚合数据分析之fielddata内存控制、circuit breaker短路器、fielddata filter、预加载机制以及序号标记预加载
白话Elasticsearch52-深入聚合数据分析之fielddata内存控制、circuit breaker短路器、fielddata filter、预加载机制以及序号标记预加载
73 0
|
11月前
|
数据挖掘
白话Elasticsearch42-深入聚合数据分析之案例实战__bucket filter:统计牌品最近一个月的平均价格(Filter Aggregation)
白话Elasticsearch42-深入聚合数据分析之案例实战__bucket filter:统计牌品最近一个月的平均价格(Filter Aggregation)
102 0