热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[大数据]-Logstash-5.3.1的安装导入数据到Elasticsearch5.3.1并配置同义词过滤

阅读此文请先阅读上文:[大数据]-Elasticsearch5.3.1IK分词,同义词联想搜索设置,前面介绍了ES,Kibana5.3.1的安装配置,以及IK分词的安装和同义词设置,这里主要记录L

阅读此文请先阅读上文:[大数据]-Elasticsearch5.3.1 IK分词,同义词/联想搜索设置,前面介绍了ES,Kibana5.3.1的安装配置,以及IK分词的安装和同义词设置,这里主要记录Logstash导入mysql数据到Elasticsearch5.3.1并设置IK分词和同义词。由于logstash配置好JDBC,ES连接之后运行脚本一站式创建index,mapping,导入数据。但是如果我们要配置IK分词器就需要修改创建index,mapping的配置,下面详细介绍。

一、Logstash-5.3.1下载安装:
  • 下载:https://www.elastic.co/cn/downloads/logstash
  • 解压:tar -zxf logstash-5.3.1.tar.gz 
  • 启动:bin/logstash -e 'input { stdin { } } output { stdout {} }'  (参数表示终端输入输出)如下则成功。
  • Sending Logstash's logs to /home/rzxes/logstash-5.3.1/logs which is now configured via log4j2.properties
    [2017-05-16T10:27:36,957][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/home/rzxes/logstash-5.3.1/data/queue"}
    [2017-05-16T10:27:37,041][INFO ][logstash.agent           ] No persistent UUID file found. Generating new UUID {:uuid=>"c987803c-9b18-4395-bbee-a83a90e6ea60", :path=>"/home/rzxes/logstash-5.3.1/data/uuid"}
    [2017-05-16T10:27:37,581][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>125}
    [2017-05-16T10:27:37,682][INFO ][logstash.pipeline        ] Pipeline main started
    The stdin plugin is now waiting for input:
    [2017-05-16T10:27:37,886][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
二、Logstash-5.3.1连接mysql作为数据源,ES作为数据输出端:
  • 由于此版本的logstash已经集成了jdbc插件,我们只需要添加一个配置文件xxx.conf。内容如下test.conf:
  • input {
        stdin {
        }
        jdbc {
          # 数据库地址  端口  数据库名
          jdbc_connection_string => "jdbc:mysql://IP:3306/dbname"
          # 数据库用户名
          jdbc_user => "user"
          # 数据库密码
          jdbc_password => "pass"
          # mysql java驱动地址
          jdbc_driver_library => "/home/rzxes/logstash-5.3.1/mysql-connector-java-5.1.17.jar"
          jdbc_driver_class => "com.mysql.jdbc.Driver"
          jdbc_paging_enabled => "true"
          jdbc_page_size => "100000"
          # sql 语句文件,也可以直接写SQL,如statement => "select * from table1"
          statement_filepath => "/home/rzxes/logstash-5.3.1/test.sql"
          schedule => "* * * * *"
          type => "jdbc"
        }
    }
    output {
        stdout {
            codec => json_lines
        }
        elasticsearch {
            hosts  => "192.168.230.150:9200"
            index => "test-1" #索引名称
            document_type => "form" #type名称
            document_id => "%{id}" #id必须是待查询的数据表的序列字段
    } }
  • 创建一个SQL文件:如上配置test.sql内容: select * from table1
  • test.conf,test.sql文件都在logstash的根目录下。
  • 运行logstash脚本导入数据: bin/logstash -f test.conf 启动如下;
  • 等待数据导入完成。开启Es-head,访问9100端口如下:
  • 可以看到已经导入了11597条数据。

  • 更多详细的配置参考官方文档:plugins-inputs-jdbc-jdbc_driver_library
三、logstash是如何创建index,mapping,并导入数据?

ES导入数据必须先创建index,mapping,但是在logstash中并没有直接创建,我们只传入了index,type等参数,logstash是通过es的mapping template来创建的,这个模板文件不需要指定字段,就可以根据输入自动生成。在logstash启动的时候这个模板已经输出了如下log:

[2017-05-23T15:58:45,801][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>#<URI::HTTP:0x68f0d43b URL:http://192.168.230.150:9200/>}
[2017-05-23T15:58:45,805][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>nil}
[2017-05-23T15:58:45,979][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"}}}}}], "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"}}}}}}}}
  • 添加IK分词,只需要创建一个json文件: vim /home/rzxes/logstash-5.3.1/template/logstash.json  添加如下内容:
  • {
        "template": "*",
        "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,
                                "analyzer": "ik_max_word",#只需要添加这一行即可设置分词器为ik_max_word
                                "fields": {
                                    "keyword": {
                                        "type": "keyword"
                                    }
                                }
                            }
                        }
                    }
                ],
                "properties": {
                    "@timestamp": {
                        "type": "date",
                        "include_in_all": false
                    },
                    "@version": {
                        "type": "keyword",
                        "include_in_all": false
                    }
                }
            }
        }
    }
  • 如需配置同义词,需自定义分词器,配置同义词过滤。修改模板logstash.json如下:

  • {
        "template" : "*",
        "version" : 50001,
        "settings" : {
            "index.refresh_interval" : "5s",
            #分词,同义词配置:自定义分词器,过滤器,如不配同义词则没有index这一部分
           "index": { "analysis": { "analyzer": { "by_smart": { "type": "custom", "tokenizer": "ik_smart", "filter": ["by_tfr","by_sfr"], "char_filter": ["by_cfr"] }, "by_max_word": { "type": "custom", "tokenizer": "ik_max_word", "filter": ["by_tfr","by_sfr"], "char_filter": ["by_cfr"] } }, "filter": { "by_tfr": { "type": "stop", "stopwords": [" "] }, "by_sfr": { "type": "synonym", "synonyms_path": "analysis/synonyms.txt" #同义词路径 } }, "char_filter": { "by_cfr": { "type": "mapping", "mappings": ["| => |"] } } } } # index --end--
          },
        "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,
                                #选择分词器:自定义分词器,或者ik_mmax_word
                                "analyzer" : "by_max_word",
                                "fields" : {
                                    "keyword" : {
                                        "type" : "keyword"
                                    }
                                }
                            }
                        }
                     }
                ],
                "properties" : {
                    "@timestamp" : {
                        "type" : "date",
                        "include_in_all" : false
                    },
                    "@version" : {
                        "type" : "keyword",
                        "include_in_all" : false
                    }
                }
            }
        }
    }
  • 有了自定义模板文件,test.conf中配置模板覆盖使模板生效。test.conf最终配置如下:
  • input {
                stdin {
                }
                jdbc {
                  # 数据库地址  端口  数据库名
                  jdbc_connection_string => "jdbc:mysql://IP:3306/dbname"
                  # 数据库用户名
                  jdbc_user => "user"
                  # 数据库密码
                  jdbc_password => "pass"
                  # mysql java驱动地址
                  jdbc_driver_library => "/home/rzxes/logstash-5.3.1/mysql-connector-java-5.1.17.jar"
                  jdbc_driver_class => "com.mysql.jdbc.Driver"
                  jdbc_paging_enabled => "true"
                  jdbc_page_size => "100000"
                  # sql 语句文件
                  statement_filepath => "/home/rzxes/logstash-5.3.1/mytest.sql"
                  schedule => "* * * * *"
                  type => "jdbc"
                }
            }
            output {
                stdout {
                    codec => json_lines
                }
                elasticsearch {
                    hosts  => "192.168.230.150:9200"
                    index => "test-1"
                    document_type => "form"
                    document_id => "%{id}" #id必须是待查询的数据表的序列字段
                    template_overwrite => true
                    template => "/home/rzxes/logstash-5.3.1/template/logstash.json"
                    }
            }
  • 删除上次创建的index(由于数据导入时会根据原有数据的index,mapping进行索引创建),重新启动logstash。
  • 最终在Kibana中检索关键词 番茄,就会发现西红柿也会被检索到。如下图:
  • 致此logstash数据导入的template重写就完成了。
  • 另一种方式配置IK分词:全局配置,不需要自定义模板。
  • curl -XPUT "http://192.168.230.150:9200/_template/rtf" -H 'Content-Type: application/json' -d'
    {
                "template" : "*",
                "version" : 50001,
                "settings" : {
                    "index.refresh_interval" : "5s",
                    "index": {
                      "analysis": {
                        "analyzer": {
                          "by_smart": {
                            "type": "custom",
                            "tokenizer": "ik_smart",
                            "filter": ["by_tfr","by_sfr"],
                            "char_filter": ["by_cfr"]
                          },
                          "by_max_word": {
                            "type": "custom",
                            "tokenizer": "ik_max_word",
                            "filter": ["by_tfr","by_sfr"],
                            "char_filter": ["by_cfr"]
                          }
                        },
                        "filter": {
                          "by_tfr": {
                            "type": "stop",
                            "stopwords": [" "]
                          },
                          "by_sfr": {
                            "type": "synonym",
                            "synonyms_path": "analysis/synonyms.txt"
                          }
                        },
                        "char_filter": {
                          "by_cfr": {
                            "type": "mapping",
                            "mappings": ["| => |"]
                          }
                        }
                      }
                    }
                  },
                "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,
                                        "analyzer" : "by_max_word", 
                                        "fields" : {  
                                            "keyword" : {
                                                "type" : "keyword"
                                            }
                                        }
                                    }
                                }
                             }
                        ],
                        "properties" : {
                            "@timestamp" : {
                                "type" : "date",
                                "include_in_all" : false
                            },
                            "@version" : {
                                "type" : "keyword",
                                "include_in_all" : false
                            }
                        }
                    }
                }
            }'
  • 可以使用curl查看模板: curl -XGET "http://192.168.230.150:9200/_template" 

推荐阅读
  • 所在位置|室友_Python+OpenCv实现图像边缘检测(滑动调节阈值)
    所在位置|室友_Python+OpenCv实现图像边缘检测(滑动调节阈值) ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • 解决Pytesser模块在Windows环境下出现的错误
    本文详细探讨了如何解决在Windows环境中使用Pytesser模块进行OCR(光学字符识别)时遇到的WindowsError错误,提供了具体的解决方案。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • Fiddler 安装与配置指南
    本文详细介绍了Fiddler的安装步骤及配置方法,旨在帮助用户顺利抓取用户Token。文章还涵盖了一些常见问题的解决方案,以确保安装过程顺利。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文详细介绍了Linux系统中信号量的相关函数,包括sem_init、sem_wait、sem_post和sem_destroy,解释了它们的功能和使用方法,并提供了示例代码。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
author-avatar
手机用户2502887703
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有