震惊,ES与MySQL竟可以这样亲密无间!

前言

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180602G0WPOP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励