前言
MySQL是目前最受欢迎的关系型数据库之一,其方便的接口和灵活的应用方式极大地提高了程序猿们开发效率。但是,玩儿数据库的宝宝都不可避免地会遇到一个问题,当数据库中的记录不断增多,其查询速度会变慢,尤其是对中文的模糊查询(建立普通索引完全不起作用)。虽然mysql5.7版本以上支持中文的全文索引,依然感觉很鸡肋。那mysql自身搞不定了,可以找帮手啊。ES(Elasticsearch)是目前最好用的全文搜索引擎,对中文的索引也能很好支持。让ES配合mysql来打辅助,快速索引将不再是一个dan疼的问题。
一. 准备工作:
1.Elasticsearch,一个提供全文搜索功能的数据库,其安装方式见:
https://www.elastic.co/downloads/elasticsearch
2.Kibana,ES数据库管理平台,可直接添加、修改、删除ES数据以及以可视化方法显示ES数据库中的数据:
https://www.elastic.co/cn/downloads/kibana
3.Elasticsearch-Head(E-H),一个ES的浏览器插件,帮助用户在浏览器上方便地查看ES数据库数据,安装方式见:
https://github.com/mobz/elasticsearch-head
如果E-H未能连接上ES,修改ES的config目录下的elasticsearch.yml,添加:
network.host:0.0.0.0
4. Logstash,一个强大的数据处理工具,帮助将不同来源的数据输入到ES数据库中,其安装方式见:
https://www.elastic.co/downloads/logstash
二.Elasticsearch与Logstash的几点小知识
1.Elasticsearch基本概念的简单理解
类比于MySQL数据库中 database(数据库)、 table (表)、row(行),在ES数据库中,存在如下的概念,
a. node :一台存储数据的服务器
b.document : ES中数据的基本存储形式,以json的形式表达
c.Index : 有相同特点的document的组合
d.type : 用来做index的逻辑目录,可以理解为对index中数据进一步做分区
e. cluster : 多台node服务器组合而成的集群
2.Logstash的conf文件配置
Logstash 需要经过一番配置才能够将数据从MySQL数据库中抓取出来存放到我们指定的Index/type里。而.conf文件就行实现数据处理、过滤、传输的配置文件。对于.conf文件,我们需要了解以下概念:
a. 用户通过配置.conf来配置Logstash的功能。如下文中的jdbc.conf,对于输入、输出、过滤,都有不同的section。每个section都包含了一个或多个插件的配置选项。Logstah处理事件需要经过以下三个步骤:input->filter->output。input产生事件数据,filter改变事件数据,output将数据传送到某地。
b. 注释(comment):与Python 一样的注释结构
c. 所有的配置选项都要根据文件的输入类型确定数值类型(Value Type),配置文件中,赋值公式为:Variable=> VALUE
三.Logstash同步
1. 准备步骤:使用logstash 同步MySQL数据到ES数据库,需要准备以下文件。
https://dev.mysql.com/downloads/connector/j/
通过测试代码可以了解是否成功安装:http://www.cnblogs.com/youxin/archive/2012/09/30/2709286.html
根据logstash 给出的建议,我们需要把该驱动再添加到logstash-core\lib\jars\目录下,对所有的jar文件进行统一管理。
b. 两个配置文件:jdbc.conf 与jdbc.sql,这两个文件可以自己进行命名,分别将这两个文件放在Logstash目录下。
注: .conf是logstash进行事件发生、处理、传输的标准文件,.sql文件为需要与mysql数据库进行通信的语句。这里已经添加了增量爬取的事项。需要注意:
1). last_run_metadata_path:有自己的默认路径,但这个路径在windows下不成立,所以需要专门设置一个路径给.logstash_jdbc_last_run
2). schedule :logstash同步的时间应该根据需要自己选取。
jdbc.conf 内容如下:
jdbc.sql 如下:
c. 既然我们需要将数据导入到ES数据库中,就需要先准备好数据所要导入的目标index,这里在Kibana平台下新建了一个叫test-index-601的index,注意,我这里应用了elasitcsearch-ik,完成了中文分词的事项https://github.com/medcl/elasticsearch-analysis-ik。注意index设置的type类型,我这里原本设置的是fulltext类型,但是logstash报错:
这是一个映射错误。我修改index为doc类型,解决了这个报错。
在Kibana创建导入的目标Index :
d. 准备好mysql 数据库中的数据,这里用了一个广泛使用的例子:
2.同步开始,在Logstash 目录下:
.bin/logstash-f jdbc.conf
可以在命令行窗口中看到Logstash将数据从MySQL抓取回来;在Chrome打开Elasticsearch-head,在数据浏览目录下,可以查看到新抓取的数据。因为采用了增量爬取机制,所以,只有在MySQL.FANTASY数据库article表新增加数据的情况下才会有新的数据被抓取、添加到ES数据库中。
四.中文字符的检索
这里给出在Kibana中进行中文字符查询的方法。注意我这里使用了match_phrase,是一种精确匹配完整字段ik插件范例中的match,则是一种模糊匹配的方法,会将“韩国”拆开再进行匹配。
五.Python与Elasticsearch的接口
目前,有两个标准库提供了Python与Elasticsearch之间的接口:https://elasticsearch-py.readthedocs.io/en/master/http://pyelasticsearch.readthedocs.io/en/latest/这里以elasticsearch库为例,给出一个从MySQL数据库抓取数据存到ES数据库的简单例子:
六.问题分析
Logstash论坛查找和提交自己的问题,工作人员会及时的进行回复。 https://discuss.elastic.co/c/logstash
领取专属 10元无门槛券
私享最新 技术干货