博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch配合mysql实现全文搜索
阅读量:6948 次
发布时间:2019-06-27

本文共 4266 字,大约阅读时间需要 14 分钟。

之前用了sphinx,发现很多东西很久都没更新过了,之前只是知道有elasticsearch这个东西,还以为是java才能用,所以一直没有去了解过,也许sphinx慢慢会被淘汰了吧。

前置条件:需要安装jdk,并配置了 JAVA_HOME。

 

需要下载的东西

Elasticsearch:

Logstash:

mysql-connector:

 

另外:可以安装 kibana,有更友好的数据展示。

elasticsearch、logstash、kibana 的安装在 mac 下可以 brew install

 

中文搜索需要安装中文分词插件(需要自己去github下载对应的版本 ):

 

bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip

 

 

logstash 和 mysql-connector 是用来实现同步 mysql 数据到 elasticsearch 的。

logstash 配置:

logstash 需要安装 logstash-input-jdbc 插件:(这一步可能会卡很久,可能的原因是,这个插件使用ruby开发,安装过程需要下载 gem,但是国外的源太慢。)

logstash/bin/plugin install logstash-input-jdbc

 

logstash 的配置使用查看:

下面是本机测试配置:

input {  jdbc {    jdbc_driver_library => "/usr/local/elasticsearch/plugins/logstash/mysql-connector-java-5.1.44-bin.jar"    jdbc_driver_class => "com.mysql.jdbc.Driver"    jdbc_connection_string => "jdbc:mysql://192.168.0.200:3306/vegent?characterEncoding=UTF-8&useSSL=false"    jdbc_user => "test"    jdbc_password => "test"    statement => "SELECT * FROM vegent"    jdbc_paging_enabled => "true"    jdbc_page_size => "50000"    schedule => "* * * * *"  }}filter {   json {        source => "message"        remove_field => ["message"]    }}output {  stdout {    codec => rubydebug  }  elasticsearch {    hosts => "192.168.0.200"    index => "vegent"  }        }

 

2018-06-02 更新:

上面的配置挖了个坑,因为没有限制条件,而且指定了 schedule,所以会一直插入重复索引。

网上有说加以下条件就可以了(没有实践,不指定是否可行):

WHERE id > :sql_last_value

 

启动Logstash:logstash -f logstash-mysql.conf ,这个logstash-mysql.conf 就是上面的配置。

查看elasticsearch是否同步数据成功:curl '192.168.0.200:9200/_cat/indices?v',如果看到大小在增长则说明同步成功了。

 

附:解决 gem 下载慢的问题(使用淘宝源)

1、gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/

2、gem sources -l,确保只有 ruby.taobao.org,

如果 还是显示 https://rubygems.org/ 进入 home的 .gemrc 文件

sudo vim ~/.gemrc
手动删除 https://rubygems.org/

3、修改Gemfile的数据源地址,这个 Gemfile 位于 logstash 目录下,修改 source 的值 为: "https://ruby.taobao.org",修改  Gemfile.jruby-1.9.lock, 找到 remote 修改它的值为: https://ruby.taobao.org (可能有几个 remote 出现,修改后面是 url 那个,替换掉 url)。

4、安装 logstash-input-jdbc,按上面的命令。

5、关于同步的问题,上面设置了一分钟一次,并且无条件同步,实际上是可以只同步那些更新过的数据的,这里还没来得及做深入研究。而且上面的配置还有个问题是,只做插入,而不是更新原有数据,这样其实并不是我们想要的结果。

 

更新:sql 语句里面可以配置只同步更新过的数据,但是这个更新需要我们去定义,好比如,数据库有一个 update_time 字段,我们更新的时候更新该字段(timestamp类型),这样我们可以把 sql 语句写为 "SELECT * FROM vegent where update_time > :sql_last_value",这个 sql_last_value 在这个时候会是上一次执行该 sql 的时间戳,这样也就实现了更新操作。另外还有一个问题是,elasticsearch 和 logstash 默认使用 UTC 时间戳,这样如果我们保存的是 PRC 时区的时间戳,这样就会有问题,因为这样 logstash 的同步语句中的时间戳是 -8:00 的,所以,还要在配置文件中加上:jdbc_default_timezone => "UTC",最后如下:

最后发现这样虽然 sql 语句时间戳正常了,但是建立的索引里面的时间戳还是 UTC 的时间戳。

最后把 UTC 改为 PRC,最后都正常了,还是和上面一样的情况,索引里面的 @timestamp 还是 UTC 的时间戳。

google 了一下,发现这个好像是不能配置的。这样怎么办呢,也许可以保存 UTC 的时间戳吧,取数据的时候再转 PRC 。(后面证实了这个猜想有点多余,还是应该使用 UTC)

上图链接:

另外一个猜想是:其实这个@timestamp 对我们的同步更新数据没影响,后来想想发现也是,其实没影响:

 上图中, :sql_last_value 是我们上一次进行 sql 查询的时间。而不是我之前以为的索引里面的 @timestamp 字段,想想也对,如果索引有 100w 数据,那么我应该取那一条记录的 @timestamp 作为 :sql_last_value 呢?

 

所以结论还是,jdbc_default_timezone 使用 UTC 就可以了。有个需要注意的问题是 时间戳字段要使用 mysql 的timestamp。

 

jdbc {    jdbc_driver_library => "/home/vagrant/logstash/mysql-connector-java-5.1.44-bin.jar"    jdbc_driver_class => "com.mysql.jdbc.Driver"    jdbc_connection_string => "jdbc:mysql://192.168.0.200:3306/test?characterEncoding=UTF-8&useSSL=false"    jdbc_user => "test"    jdbc_password => "test"    jdbc_default_timezone => "UTC"    statement => "SELECT * FROM test where update_time > :sql_last_value"    jdbc_paging_enabled => "true"    jdbc_page_size => "50000"    schedule => "* * * * *"  }

 

查询例子:

curl 'localhost:9200/vegent/_search?pretty=true'  -d '{  "query" : { "match" : { "type" : "冬瓜" }}}'

输出(一部分):

查询 type 字段包含了 "冬瓜" 的所有记录。vegent 是索引的名称。?pretty=true 是指定友好输出格式。

返回结果的 took字段表示该操作的耗时(单位为毫秒),timed_out字段表示是否超时,hits字段表示命中的记录,里面子字段的含义如下。

  total:返回记录数,本例是487893条。
  max_score:最高的匹配程度,本例是5.598418。
  hits:返回的记录组成的数组。

 

logstash 文档地址:

 

其他问题:

1、无法远程连接,默认只允许本机连接,可以修改配置文件 elasticsearch/config/elasticsearch.yml

# Set the bind address to a specific IP (IPv4 or IPv6):##network.host: 192.168.0.1transport.host: localhosttransport.tcp.port: 9300http.port: 9200network.host: 0.0.0.0

2、上面的 "同步",并不是真正的同步,当有新数据的时候,上面做的只是把新数据继续加到索引里面,而不是根据对应的 id 去删除原来的数据,这些需要自己做其他操作,目前还没做深入了解。

 

转载于:https://www.cnblogs.com/eleven24/p/7733052.html

你可能感兴趣的文章
php扩展php-redis安装与使用
查看>>
python一天一题(2)
查看>>
Win10下安装Ubuntu16.04虚拟机并搭建TensorFlow1.3环境
查看>>
leetcode 108. Convert Sorted Array to Binary Search Tree
查看>>
【商城购物车】购物车逻辑
查看>>
PCIE协议解析 synopsys IP loopback 读书笔记(1)
查看>>
创建maven工程的时候卡死的解决办法
查看>>
Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
查看>>
微信小程序保存图片功能实现
查看>>
【Shiro】小读Shiro Filter(未完待续)
查看>>
Android环信即时通讯集成坑爹 注册报错208解决
查看>>
Flink及主流流框架spark,storm比较
查看>>
mysql按位的索引判断位的值
查看>>
一套简约漂亮的响应式博客园主题皮肤
查看>>
js获取时间戳
查看>>
Java数据结构和算法(四):栈
查看>>
为什么我的mac插入耳机耳机没有声音呢?
查看>>
ArcGIS js api 手动构建FeatureLayer
查看>>
Spark RDD持久化、广播变量和累加器
查看>>
Exception in thread "main" javax.validation.ValidationException: Unable to find a default provider
查看>>