首页 文章 精选 留言 我的

精选列表

搜索[data],共10027篇文章
优秀的个人博客,低调大师

非平衡数据(imbalanced data)的简单介绍

不平衡分类是指分类预测建模问题,其中每个类标签的训练数据集中的示例数量不平衡。也就是说,类分布不等于或接近等于,而是有偏差或偏斜。 不平衡分类问题是分类问题的一个示例,其中已知类中的示例分布有偏差或偏斜。分布可以从轻微的偏差到严重的不平衡,其中少数类中有一个示例,而多数类中有数百、数千或数百万个示例。 不平衡的分类对预测建模提出了挑战,因为大多数用于分类的机器学习算法都是围绕每个类的示例数量相等的假设设计的。这会导致模型的预测性能不佳,特别是对于少数类。这是一个问题,因为通常少数类更重要,因此问题对少数类的分类错误比多数类更敏感。我们将这些类型的问题称为“不平衡分类”而不是“不平衡分类”。不平衡是指已经平衡但现在不再平衡的类分布,而不平衡是指本质上不平衡的类分布。 理想数据集正负样本是均等的,这有利于机器学习模型训练。 现实中正负样本常常不均等,而且正负样本比例相差甚大,如下图橘红色样本仅占10%左右。 什么是非平衡数据集?当正负样本占比相差过大时,就是非平衡数据集。如下图负面样本仅占0.001,属于典型非平衡数据集。 不平衡分类的挑战 汇总对比一下理想数据分布情况和正负样本不均情况。类别分布的不平衡会因问题而异。 一个分类问题可能有点偏,比如有轻微的不平衡。或者,分类问题可能存在严重的不平衡,对于给定的训练数据集,一个类中可能有数百或数千个示例,而另一类中可能有数十个示例。 轻微失衡。一个不平衡的分类问题,其中示例的分布在训练数据集中有少量不均匀(例如 4:6)。 严重失衡。一个不平衡的分类问题,其中示例的分布在训练数据集中大量不均匀(例如 1:100 或更多)。 当代大多数关于类别失衡的数据集都集中在1:4到1:100的失衡比例上。[…] 在欺诈检测或化学信息学等实际应用中,我们可能会处理不平衡比范围为 1:1000 到 1:5000 的问题。 下面是非平衡数据点状图分布 非平衡数据集在现实生活中有非常多应用。常见下述情况: 欺诈识别 医疗诊断 石油泄漏侦查 索赔预测 默认预测 面部识别 流失预测 垃圾邮件检测 异常检测 异常值检测 ***检测 转换预测 非平衡数据例子1:从海面卫星雷达图像检测漏油 如下图,石油泄漏面积仅占海洋区域非常小比例,难以发现,属于经典非平衡数据例子 非平衡数据例子2:癌细胞诊断和预测 癌细胞仅占正常细胞非常小比例,也属于经典非平衡数据处理例子。 非平衡数据例子3:反欺诈 1.交易支付诈骗 2.电信诈骗 3.职工诈骗,欺诈群体一般占总人群2% 在银行,消费金融,金融科技公司做过反欺诈的朋友都知道,真实场景中欺诈客户常常在 2%左右,甚至更低。风控模型对于捕捉欺诈客户非常吃力,因为模型训练数据时就会遇到坏客户占比太低的难题。 机器学习领域有的很多解决非平衡数据的方法,我罗列了一些常用的方法,包括 Under sampling欠采样 Over sampling过采样 SMOTE(synthetic minority over0sampling technique)非直接对少数类进行重采样,而是设计算法来人工合成一些新的少数样本。实际测试中,此方法效果较好 class_weight参数调整 其它算法解决方案 数据分析中的过采样和欠采样是用于调整数据集的类分布(即所表示的不同类/类别之间的比率)的技术。这些术语用于统计抽样、调查设计方法和机器学习。过采样和欠采样是相反且大致等效的技术。过采样和欠采样原理如下图: SMOTE 有多种方法可用于对典型分类问题中使用的数据集进行过采样(使用分类算法对一组图像进行分类,给定一组带标签的训练图像)。最常见的技术被称为 SMOTE:合成少数过采样技术。[4]为了说明这种技术是如何工作的,考虑一些训练数据,其中有s 个样本,以及数据特征空间中的f 个特征。请注意,为简单起见,这些特征是连续的。例如,考虑用于分类的鸟类数据集。我们想要对其进行过采样的少数类的特征空间可以是喙长、翼展和重量(都是连续的)。为了过采样,从数据集中取一个样本,并考虑它的k 个最近邻(在特征空间中)。要创建合成数据点,请获取这k 个邻居之一与当前数据点之间的向量。将此向量乘以介于 0 和 1 之间的随机数x。将其添加到当前数据点以创建新的合成数据点。 如果看不懂smote术语解释没关系,我用可视化图解smote原理。 如下图,红色数据是minority class,即占比较小的数据集,一共只有4个。 绿色数据是majority class,即占比较大的数据集,一共13个。 为了训练模型时解决非平衡数据问题,我们使用smote方法。 (备注:属于解读 具有丰富示例的类称为主要类或多数类,而示例很少(通常只有一个)的类称为次要类或少数类。 多数类:具有许多示例的不平衡分类预测建模问题中的类(或多个类)。 少数类:不平衡分类预测建模问题中的类,样本很少。 ) 我们通过向量方法链接四个红色点,新的数据(创造的伪数据)就会出现在红色点链接的线上。 大家看,新创造的8个点出现在红色点链接的线上。这样红色数据集就有12个,蓝色数据集有13个,基本是5:5平衡了。 通过上述smote方法,我们解决了非平衡数据问题。 ADASYN ADASYN是smote方法升级版。自适应合成采样方法或 ADASYN 算法建立在SMOTE方法的基础上,通过将分类边界的重要性转移到那些困难的少数类。ADASYN 根据学习难度对不同的少数类示例使用加权分布,其中为更难学习的少数类示例生成更多合成数据。 增强技术 数据分析中的数据增强是用于通过添加对现有数据或从现有数据新创建的合成数据稍加修改的副本来增加数据量的技术。它充当正则化器,有助于在训练机器学习模型时减少过度拟合。 非平衡数据处理副作用 非平衡数据处理方法不是万能的,使用要非常小心,最好是机器学习经验丰富的朋友来处理较好。过采样,欠采样或smote方法都可能引起过拟合问题,这会导致模型过于具体。训练集的准确性很可能是很高的情况,但是新数据集的性能实际上却很差。 如果想了解真实非平衡数据处理案例和python脚本解决方案,欢迎学习《python金融风控评分卡模型和数据分析》课程:https://edu.51cto.com/sd/f2e9b 。此课程采用真实12万+信贷数据建模,并包含如何应用算法处理非平衡数据问题,并且显著提升模型性能,包括ks,auc,可谓一石二鸟。 不平衡数据学习不仅给数据研究界带来了重大的新挑战,而且在现实世界的数据密集型应用中提出了许多关键问题,从金融和生物医学数据分析等民用应用到安全和国防相关应用,如监控和军事数据分析。希望各位机器学习爱好者能关注此问题。

优秀的个人博客,低调大师

Data Science | 时间序列的索引与切片

时间序列的索引与切片索引时间序列的索引方法同样是适用于Dataframe,而且在时间序列中由于按照时间先后排序,故不用考虑顺序问题。 基本位置索引,使用的方法和列表类似: from datetime import datetime rng = pd.date_range('2017/1','2017/3') ts = pd.Series(np.random.rand(len(rng)), index = rng) print(ts.head()) print(ts[0]) print(ts[:2]) >>> 2017-01-01 0.107736 2017-01-02 0.887981 2017-01-03 0.712862 2017-01-04 0.920021 2017-01-05 0.317863 Freq: D, dtype: float64 0.107735945027 2017-01-01 0.107736 2017-01-02 0.887981 Freq: D, dtype: float64 除了基本位置索引之外还有时间序列标签索引: from datetime import datetime rng = pd.date_range('2017/1','2017/3') ts = pd.Series(np.random.rand(len(rng)), index = rng) print(ts['2017/1/2']) print(ts['20170103']) print(ts['1/10/2017']) print(ts[datetime(2017,1,20)]) >>> 0.887980757812 0.712861778966 0.788336674948 0.93070380011 切片切片的使用操作在上面索引部分的基本位置索引中有提到和Series按照index索引原理一样,也是末端包含。 rng = pd.date_range('2017/1','2017/3',freq = '12H') ts = pd.Series(np.random.rand(len(rng)), index = rng) print(ts['2017/1/5':'2017/1/10']) >>> 2017-01-05 00:00:00 0.462085 2017-01-05 12:00:00 0.778637 2017-01-06 00:00:00 0.356306 2017-01-06 12:00:00 0.667964 2017-01-07 00:00:00 0.246857 2017-01-07 12:00:00 0.386956 2017-01-08 00:00:00 0.328203 2017-01-08 12:00:00 0.260853 2017-01-09 00:00:00 0.224920 2017-01-09 12:00:00 0.397457 2017-01-10 00:00:00 0.158729 2017-01-10 12:00:00 0.501266 Freq: 12H, dtype: float64 # 在这里我们可以传入月份可以直接获取整个月份的切片 print(ts['2017/2'].head()) >>> 2017-02-01 00:00:00 0.243932 2017-02-01 12:00:00 0.220830 2017-02-02 00:00:00 0.896107 2017-02-02 12:00:00 0.476584 2017-02-03 00:00:00 0.515817 Freq: 12H, dtype: float64 重复索引的时间序列 dates = pd.DatetimeIndex(['1/1/2015','1/2/2015','1/3/2015','1/4/2015','1/1/2015','1/2/2015']) ts = pd.Series(np.random.rand(6), index = dates) print(ts) # 我们可以通过is_unique检查值或index是否重复 print(ts.is_unique,ts.index.is_unique) >>> 2015-01-01 0.300286 2015-01-02 0.603865 2015-01-03 0.017949 2015-01-04 0.026621 2015-01-01 0.791441 2015-01-02 0.526622 dtype: float64 True False 按照上面的结果,可以看出在上面的时间序列中,出现了index(ts.index.is_unique)重复但值(ts.is_unique)不重复的情况。 我们可以通过时间序列把重复索引对应的值取平均值来解决索引重复的问题: print(ts.groupby(level = 0).mean()) # 通过groupby做分组,重复的值这里用平均值处理 >>> 2015-01-01 0.545863 2015-01-02 0.565244 2015-01-03 0.017949 2015-01-04 0.026621 dtype: float64 原文发布时间为:2018-12-17本文作者: 煌金的咸鱼本文来自云栖社区合作伙伴“ 咸鱼普拉思”,了解相关信息可以关注“xianyuplus1995”微信公众号

优秀的个人博客,低调大师

Migrating MySQL Data into Elasticsearch using logstash

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html 8.11.1.安装 logstash 安装 JDBC 驱动 和 Logstash curl -s https://raw.githubusercontent.com/oscm/shell/master/database/mysql/5.7/mysql-connector-java.sh | bash curl -s https://raw.githubusercontent.com/oscm/shell/master/search/logstash/logstash-5.x.sh | bash mysql 驱动文件位置在 /usr/share/java/mysql-connector-java.jar 8.11.2.配置 logstash 创建配置文件 /etc/logstash/conf.d/jdbc-mysql.conf mysql> desc article; +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | id | int(11) | NO | | 0 | | | title | mediumtext | NO | | NULL | | | description | mediumtext | YES | | NULL | | | author | varchar(100) | YES | | NULL | | | source | varchar(100) | YES | | NULL | | | ctime | datetime | NO | | NULL | | | content | longtext | YES | | NULL | | +-------------+--------------+------+-----+---------+-------+ 7 rows in set (0.00 sec) input { jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "password" schedule => "* * * * *" statement => "select * from article" } } output { elasticsearch { hosts => "localhost:9200" index => "information" document_type => "article" document_id => "%{id}" } } 8.11.3.启动 Logstash root@netkiller /var/log/logstash % systemctl restart logstash root@netkiller /var/log/logstash % systemctl status logstash ● logstash.service - logstash Loaded: loaded (/etc/systemd/system/logstash.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2017-07-31 09:35:00 CST; 11s ago Main PID: 10434 (java) CGroup: /system.slice/logstash.service └─10434 /usr/bin/java -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -Djava.awt.headless=true -Dfi... Jul 31 09:35:00 netkiller systemd[1]: Started logstash. Jul 31 09:35:00 netkiller systemd[1]: Starting logstash... root@netkiller /var/log/logstash % cat logstash-plain.log [2017-07-31T09:35:28,169][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}} [2017-07-31T09:35:28,172][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://localhost:9200/, :path=>"/"} [2017-07-31T09:35:28,298][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>#<Java::JavaNet::URI:0x453a18e9>} [2017-07-31T09:35:28,299][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>nil} [2017-07-31T09:35:28,337][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>50001, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"_all"=>{"enabled"=>true, "norms"=>false}, "dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date", "include_in_all"=>false}, "@version"=>{"type"=>"keyword", "include_in_all"=>false}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}} [2017-07-31T09:35:28,344][INFO ][logstash.outputs.elasticsearch] Installing elasticsearch template to _template/logstash [2017-07-31T09:35:28,465][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>[#<Java::JavaNet::URI:0x66df34ae>]} [2017-07-31T09:35:28,483][INFO ][logstash.pipeline ] Starting pipeline {"id"=>"main", "pipeline.workers"=>8, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>1000} [2017-07-31T09:35:29,562][INFO ][logstash.pipeline ] Pipeline main started [2017-07-31T09:35:29,700][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600} [2017-07-31T09:36:01,019][INFO ][logstash.inputs.jdbc ] (0.006000s) select * from article 8.11.4.验证 % curl -XGET 'http://localhost:9200/_all/_search?pretty' 8.11.5.配置模板 8.11.5.1.全量导入 适合数据没有改变的归档数据或者只能增加没有修改的数据 input { jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "password" schedule => "* * * * *" statement => "select * from article" } } output { elasticsearch { hosts => "localhost:9200" index => "information" document_type => "article" document_id => "%{id}" } } 8.11.5.2.多表导入 多张数据表导入到 Elasticsearch # multiple inputs on logstash jdbc input { jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "password" schedule => "* * * * *" statement => "select * from article" type => "article" } jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "password" schedule => "* * * * *" statement => "select * from comment" type => "comment" } } output { elasticsearch { hosts => "localhost:9200" index => "information" document_type => "%{type}" document_id => "%{id}" } } 需要在每一个jdbc配置项中加入 type 配置,然后 elasticsearch 配置项中加入 document_type => "%{type}" 8.11.5.3.通过 ID 主键字段增量复制数据 input { jdbc { statement => "SELECT id, mycolumn1, mycolumn2 FROM my_table WHERE id > :sql_last_value" use_column_value => true tracking_column => "id" tracking_column_type => "numeric" # ... other configuration bits } } tracking_column_type => "numeric" 可以声明 id 字段的数据类型, 如果不指定将会默认为日期 [2017-07-31T11:08:00,193][INFO ][logstash.inputs.jdbc ] (0.020000s) select * from article where id > '2017-07-31 02:47:00' 如果复制不对称可以加入 clean_run => true 配置项,清楚数据 8.11.5.4.通过日期字段增量复制数据 input { jdbc { statement => "SELECT * FROM my_table WHERE create_date > :sql_last_value" use_column_value => true tracking_column => "create_date" # ... other configuration bits } } 如果复制不对称可以加入 clean_run => true 配置项,清楚数据 8.11.5.5.指定SQL文件 statement_filepath 指定 SQL 文件,有时SQL太复杂写入 statement 配置项维护部方便,可以将 SQL 写入一个文本文件,然后使用 statement_filepath 配置项引用该文件。 input { jdbc { jdbc_driver_library => "/path/to/driver.jar" jdbc_driver_class => "org.postgresql.Driver" jdbc_url => "jdbc://postgresql" jdbc_user => "neo" jdbc_password => "password" statement_filepath => "query.sql" } } 8.11.5.6.参数传递 将需要复制的条件参数写入 parameters 配置项 input { jdbc { jdbc_driver_library => "mysql-connector-java-5.1.36-bin.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb" jdbc_user => "mysql" parameters => { "favorite_artist" => "Beethoven" } schedule => "* * * * *" statement => "SELECT * from songs where artist = :favorite_artist" } } 8.11.5.7.控制返回JDBC数据量 jdbc_fetch_size => 1000 #jdbc获取数据的数量大小 jdbc_page_size => 1000 #jdbc一页的大小, jdbc_paging_enabled => true #和jdbc_page_size组合,将statement的查询分解成多个查询,相当于: SELECT * FROM table LIMIT 1000 OFFSET 4000 8.11.5.8.输出到不同的 Elasticsearch 中 通过 if [type]=="news" 执行不同的区块,实现将不同的type输出到指定的 index 中。 output { if [type]=="news" { elasticsearch { hosts => "node1.netkiller.cn:9200" index => "information" document_id => "%{id}" } } if [type]=="comment" { elasticsearch { hosts => "node2.netkiller.cn:9200" index => "information" document_id => "%{id}" } } } 8.11.5.9.日期格式转换 日期格式化, 将ISO 8601日期格式转换为 %Y-%m-%d %H:%M:%S input { jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/cms" jdbc_user => "cms" jdbc_password => "123456" schedule => "* * * * *" statement => "select * from article limit 5" } } filter { ruby { init => "require 'time'" code => "event.set('ctime', event.get('ctime').time.localtime.strftime('%Y-%m-%d %H:%M:%S'))" } ruby { init => "require 'time'" code => "event.set('mtime', event.get('mtime').time.localtime.strftime('%Y-%m-%d %H:%M:%S'))" } } output { stdout { codec => rubydebug } } 8.11.5.10.example 下面的例子实现了新数据复制,旧数据更新 input { jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "password" schedule => "* * * * *" #定时cron的表达式,这里是每分钟执行一次 statement => "select id, title, description, author, source, ctime, content from article where id > :sql_last_value" use_column_value => true tracking_column => "id" tracking_column_type => "numeric" record_last_run => true last_run_metadata_path => "/var/tmp/article.last" } jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "password" schedule => "* * * * *" #定时cron的表达式,这里是每分钟执行一次 statement => "select * from article where ctime > :sql_last_value" use_column_value => true tracking_column => "ctime" tracking_column_type => "timestamp" record_last_run => true last_run_metadata_path => "/var/tmp/article-ctime.last" } } output { elasticsearch { hosts => "localhost:9200" index => "information" document_type => "article" document_id => "%{id}" action => "update" # 操作执行的动作,可选值有["index", "delete", "create", "update"] doc_as_upsert => true #支持update模式 } } 8.11.6.解决数据不对称问题 jdbc-input-plugin 只能实现数据库的追加,对于 elasticsearch 增量写入,但经常jdbc源一端的数据库可能会做数据库删除或者更新操作。这样一来数据库与搜索引擎的数据库就出现了不对称的情况。 当然你如果有开发团队可以写程序在删除或者更新的时候同步对搜索引擎操作。如果你没有这个能力,可以尝试下面的方法。 这里有一个数据表 article , mtime 字段定义了 ON UPDATE CURRENT_TIMESTAMP 所以每次更新mtime的时间都会变化 mysql> desc article; +-------------+--------------+------+-----+--------------------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+--------------------------------+-------+ | id | int(11) | NO | | 0 | | | title | mediumtext | NO | | NULL | | | description | mediumtext | YES | | NULL | | | author | varchar(100) | YES | | NULL | | | source | varchar(100) | YES | | NULL | | | content | longtext | YES | | NULL | | | status | enum('Y','N')| NO | | 'N' | | | ctime | timestamp | NO | | CURRENT_TIMESTAMP | | | mtime | timestamp | YES | | ON UPDATE CURRENT_TIMESTAMP | | +-------------+--------------+------+-----+--------------------------------+-------+ 7 rows in set (0.00 sec) logstash 增加 mtime 的查询规则 jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "password" schedule => "* * * * *" #定时cron的表达式,这里是每分钟执行一次 statement => "select * from article where mtime > :sql_last_value" use_column_value => true tracking_column => "mtime" tracking_column_type => "timestamp" record_last_run => true last_run_metadata_path => "/var/tmp/article-mtime.last" } 创建回收站表,这个事用于解决数据库删除,或者禁用 status = 'N' 这种情况的。 CREATE TABLE `elasticsearch_trash` ( `id` int(11) NOT NULL, `ctime` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 为 article 表创建触发器 CREATE DEFINER=`dba`@`%` TRIGGER `article_BEFORE_UPDATE` BEFORE UPDATE ON `article` FOR EACH ROW BEGIN -- 此处的逻辑是解决文章状态变为 N 的时候,需要将搜索引擎中对应的数据删除。 IF NEW.status = 'N' THEN insert into elasticsearch_trash(id) values(OLD.id); END IF; -- 此处逻辑是修改状态到 Y 的时候,方式elasticsearch_trash仍然存在该文章ID,导致误删除。所以需要删除回收站中得回收记录。 IF NEW.status = 'Y' THEN delete from elasticsearch_trash where id = OLD.id; END IF; END CREATE DEFINER=`dba`@`%` TRIGGER `article_BEFORE_DELETE` BEFORE DELETE ON `article` FOR EACH ROW BEGIN -- 此处逻辑是文章被删除同事将改文章放入搜索引擎回收站。 insert into elasticsearch_trash(id) values(OLD.id); END 接下来我们需要写一个简单地 Shell 每分钟运行一次,从 elasticsearch_trash 数据表中取出数据,然后使用 curl 命令调用 elasticsearch restful 接口,删除被收回的数据。 8.11.7.修改 Mapping <paraf>需求 Elasticsearch 时间格式 从ISO 8601 到 yyyy-MM-dd HH:mm:ss。首先停止 logstash</paraf> systemctl stop logstash rm -rf /var/tmp/article* 修改 /etc/logstash/conf.d/jdbc.conf 配置文件 input { jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "123456" schedule => "* * * * *" statement => "select * from article where id > :sql_last_value" use_column_value => true tracking_column => "id" tracking_column_type => "numeric" record_last_run => true last_run_metadata_path => "/var/tmp/article.last" } jdbc { jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/cms" jdbc_user => "cms" jdbc_password => "123456" schedule => "* * * * *" #定时cron的表达式,这里是每分钟执行一次 statement => "select * from article where ctime > :sql_last_value" use_column_value => true tracking_column => "ctime" tracking_column_type => "timestamp" record_last_run => true last_run_metadata_path => "/var/tmp/article-ctime.last" } } filter { ruby { code => "event.set('ctime', event.get('[ctime]').time.localtime.strftime('%Y-%m-%d %H:%M:%S'))" } ruby { code => "event.set('mtime', event.get('[mtime]').time.localtime.strftime('%Y-%m-%d %H:%M:%S'))" } } output { elasticsearch { hosts => "localhost:9200" index => "information" document_type => "article" document_id => "%{id}" action => "update" doc_as_upsert => true } } 删除就的index,重新创建,并配置 mapping。 curl -XDELETE http://localhost:9200/information curl -XPUT http://localhost:9200/information curl -XPOST http://localhost:9200/information/article/_mapping -d' { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" }, "description": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" }, "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" }, "ctime": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "mtime": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" } } }' curl "http://localhost:9200/information/article/_mapping?pretty" 启动 logstash 重新复制数据。 rm -rf /var/log/logstash/* systemctl start logstash 原文出处:Netkiller 系列 手札 本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册