一、ElasticSearch了解
ElasticSearch是一个基于lucene的分布式检索服务器。相对于solr搜索,在大数据量和数据并发量上更有优势,同时,也有数据库的数据存储功能,但提供了比数据库更多的存储功能,如分词搜索、关联度搜索等,同事搜索速度也不是一个级别,达到百万数据/秒的查询数据。总结优点为:实时搜索、稳定、可靠、快速、安装方便等。
ElasticSearch中的概念(或叫做结构)和数据库中进行对比:
(1)、index:索引,相当于数据库中的一个库,里面可以建立很多表,存储不同类型的数据
(2)、type:类型,相当于数据库中的一张表,存储json类型的数据
(3)、document:文档,一个文档相当于数据库中的一条数据
(4)、field:列,相当于数据库中的列,也就是一个属性
(5)、shards:分片,通俗理解,就是数据分成几块区域来存储,可以理解为mysql中的分库分表(不太恰当)
(6)、replicas:备份,就是分片的备份数,相当于数据库中的备份库
二、ElasticSearch+nodejs+head集成安装(安装环境:jdk8,window10)
1、先安装ElasticSearch
(注意:ElasticSearch目前最新版本达到了7.0.1,但不同的版本在不同的安装环境下回出现不同的兼容性问题,详见百度,目前遇到的问题有:用7.0.1版本时无法设置network.host为0.0.0.0,这样见无法让外部服务去范围当前服务器,故改成现在的6.7.2是可以的,并且,ElasticSearch是Java项目,需要依赖jdk,并且对jdk版本有要求,目前安装的是jdk8)
(1)、安装:具体安装为在官网https://www.elastic.co/cn/downloads/elasticsearch#ga-release下载相应的版本后如:elasticsearch-6.7.2.zip,进行解压即可。
(2)、启动:到elasticsearch-6.7.2\bin目录下,启动elasticsearch.bat即可
(3)、判断是否安装启动成功:访问http://localhost:9200,出现如下图即为成功
2、安装nodejs
(1)、在 下载对应的版本,进行傻瓜式安装(默认安装成功后自动配置环境变量)
(2)、安装成功后使用 node -v查看nodejs的版本,使用npm -v查看npm的版本,如图:
(3)、在nodejs的根目录下,执行npm install -g grunt-cli命令,安装grunt,安装完成后执行grunt -version查看是否安装成功,如图:
3、安装head
(1)、网上下载elasticsearch-head.zip文件解压即可
(2)、修改elasticsearch-head文件目录下的Gruntfile.js文件,添加如下内容:
(3)、修改elasticsearch-head\_site文件目录下的app.js文件内容,将红框中的内容修改为服务器地址,或是本机部署则不用修改。
(4)、进入elasticsearch-head的跟目录下执行npm install 命令,如图:
(5)、在elasticsearch-head的根目录下启动nodejs,执行grunt server 或者 npm run start,如图:
(6)、访问http://localhost:9100,出现如图所示,则head+nodejs安装成功
(7)、若想让head启动并链接elasticsearch成功,需先启动elasticsearch,若head和elasticsearch不在同一服务器上时,需要在elasticsearch中做如下配置:
修改elasticsearch.yml文件,在文件末尾加入:
http.cors.enabled: true
http.cors.allow-origin: "*" node.master: true node.data: true放开network.host: 192.168.0.1的注释并改为network.host: 0.0.0.0(这样外部服务器也能访问es服务)
放开cluster.name(集群名称,服务启动前修改后,以后不要再随意修改);node.name(集群使用时回用到);http.port(默认端口号即可)的注释
双击elasticsearch.bat重启es
修改完elasticsearch.yml文件完启动es后再访问http://localhost:9100,若head链接es成功后如下图:
4、在head中对es数据进行操作,如,添加删除索引,对索引中的数据进行增删改差等操作。(详见百度)
三、springboot+elasticsearch集成及简单使用
1、先搭建好单独的springboot项目,以及部署好elasticsearch服务
2、具体集成步骤及通过对象的方式操作elasticsearch的具体步骤语法详见博客:
四、利用logstash实现MySQL中的数据全量/增量同步到elasticsearch服务器中(window10环境)
1、logstash的下载安装
logstash的官网下载地址:,注意下载的版本要与elasticsearch版本必须一直,如当前elasticsearch的版本是6.7.2,则logstash的版本也必须是6.7.2
注意,在网上各种查找资料发现好多资料都需集成logstash-jdbc-input插件才能实现数据同步,后台才发现这个和版本有关系,在elasticsearch5.X及之后的版本是不需要集成该插件即可
下载好相应的版本后解压即可(注意解压的路径,最好不要有中文和空格)。
2、logstash配置
(1)、在logstash-6.7.2路径下创建空文件夹,如mysql,用来存放相关配置文件等
(2)、在创建的新文件夹中(mysql文件夹)中放入驱动包:mysql-connector-java.jar
(3)、在创建的新文件夹中(mysql文件夹)中创建一个sql文件,如find.sql,从这里开始,就是logstash同步数据库的核心操作了,在这里创建的sql文件主要内容是:mysql需要同步Elasticsearch的具体数据的查询方式,如果是全量同步,只需要select * from [table]即可
(4)、在创建的新文件夹中(mysql文件夹)中创建一个conf文件,如jdbc.conf文件,该文件用于链接数据库和elasticsearch,其内容为:(注意,有的可能不识别注解,运行时需要将注解去掉)
input { stdin { } jdbc { # mysql 数据库链接,my_es为数据库名 jdbc_connection_string => "jdbc:mysql://localhost:3306/my_es" # 用户名和密码 jdbc_user => "root" jdbc_password => "root" # 驱动 jdbc_driver_library => "D:\logstash-6.7.2\mysql\mysql-connector-java-5.1.46.jar" # 驱动类名 jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_paging_enabled => "true" jdbc_page_size => "50000" # 执行的sql 就是上一步创建的sql文件的绝对路径+文件名字 statement_filepath => "D:\logstash-6.7.2\mysql\find.sql" # 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新 schedule => "* * * * *" # 索引类型 type => "center" }}filter { json { source => "message" remove_field => ["message"] }}output { elasticsearch { # ES的IP地址及端口 hosts => ["localhost:9200"] # 索引名称 index => "article" # 自增ID id必须是待查询的数据表的序列字段 document_id => "%{id}" } stdout { # JSON格式输出 codec => json_lines }}
网上的第二中配置,部分不同而已:
input { stdin { } jdbc { jdbc_connection_string => "jdbc:mysql://localhost:3306/你的数据库名字" jdbc_user => "你的数据库用户名" jdbc_password => "你的数据库密码" jdbc_driver_library => "C:/logstash/bin/mysql-connector-java-5.1.44-bin.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_paging_enabled => "true" jdbc_page_size => "50000" statement => "SELECT id(主键),其他内容 FROM 你的表" schedule => "* * * * *" }}output { stdout { codec => json_lines } elasticsearch { hosts => "localhost:9200" index => "你要创建的索引名" document_type => "你要创建的索引类型" document_id => "%{id}" }}
另一个说明比较详细的版本:
input { stdin { } jdbc { # 连接的数据库地址和哪一个数据库,指定编码格式,禁用SSL协议,设定自动重连 jdbc_connection_string => "jdbc:mysql://数据库地址:端口号/数据库名?characterEncoding=UTF-8&useSSL=false&autoReconnect=true" # 你的账户密码 jdbc_user => "账号" jdbc_password => "密码" # 连接数据库的驱动包,建议使用绝对地址 jdbc_driver_library => "mysql/mysql-connector-java-5.1.45-bin.jar" # 这是不用动就好 jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_paging_enabled => "true" jdbc_page_size => "50000" #处理中文乱码问题 codec => plain { charset => "UTF-8"} #使用其它字段追踪,而不是用时间 use_column_value => true #追踪的字段 tracking_column => testid record_last_run => true #上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值 last_run_metadata_path => "mysql/station_parameter.txt" jdbc_default_timezone => "Asia/Shanghai" statement_filepath => "mysql/jdbc.sql" #是否清除 last_run_metadata_path 的记录,如果为真那么每次都相当于从头开始查询所有的数据库记录 clean_run => false # 这是控制定时的,重复执行导入任务的时间间隔,第一位是分钟 schedule => "*/5 * * * *" type => "jdbc" }} filter { json { source => "message" remove_field => ["message"] }} output { elasticsearch { # 要导入到的Elasticsearch所在的主机 hosts => "192.168.105.180:9200" # 要导入到的Elasticsearch的索引的名称 index => "db_anytest" # 类型名称(类似数据库表名) document_type => "table_anytest" # 主键名称(类似数据库主键) document_id => "%{testid}" # es 账号 user => elastic password => changeme } stdout { # JSON格式输出 codec => json_lines }}
3、启动logstash开始同步数据库
(1)、确保elasticsearch服务已启动,并且要同步的表里有相应的数据
(2)、cmd一个新窗口,进入到D:\logstash-6.7.2\bin
(3)、运行命令logstash -f ../mysql/jdbc.conf ,其中logstash -f表示运行指令, ../mysql/jdbc.conf表示我们配置的jdbc.conf文件路径,成功启动后,可以在终端中看见运行的sql和同步的数据,如图:
(4)、同步成功后即可在head中查看同步到elasticsearch中的数据,其中timestamp和version是elastisearch自己添加的字段。
(5)注意点:
a、在同步的时候,如果是首次全量同步的话,可以不需要在elasticsearch中去新建索引和类型,同步的时候会根据配置自动创建
b、若是增量更新的话,在sql中添加查询条件即可,如
where testid >= :sql_last_start
c、对与多表数据同步的情况,参考文献:,进行操作