在我的一个项目中,我计划将 ElasticSearch 与 MySQL 一起使用。我已经成功安装了 ElasticSearch。我可以单独管理 ES 中的索引。但我不知道如何用 MySQL 实现相同的功能。
我已经阅读了一些文件,但我有点困惑并且没有清晰的想法。
在我的一个项目中,我计划将 ElasticSearch 与 MySQL 一起使用。我已经成功安装了 ElasticSearch。我可以单独管理 ES 中的索引。但我不知道如何用 MySQL 实现相同的功能。
我已经阅读了一些文件,但我有点困惑并且没有清晰的想法。
从 ES 5.x 开始,他们通过logstash插件提供了开箱即用的功能。
这将定期从数据库导入数据并推送到 ES 服务器。
必须创建一个下面给出的简单导入文件(此处也有描述)并使用 logstash 运行脚本。Logstash 支持按计划运行此脚本。
# file: contacts-index-logstash.conf
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
jdbc_user => "user"
jdbc_password => "pswd"
schedule => "* * * * *"
jdbc_validate_connection => true
jdbc_driver_library => "/path/to/latest/mysql-connector-java-jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
statement => "SELECT * from contacts where updatedAt > :sql_last_value"
}
}
output {
elasticsearch {
protocol => http
index => "contacts"
document_type => "contact"
document_id => "%{id}"
host => "ES_NODE_HOST"
}
}
# "* * * * *" -> run every minute
# sql_last_value is a built in parameter whose value is set to Thursday, 1 January 1970,
# or 0 if use_column_value is true and tracking_column is set
你可以从这里的 maven 下载 mysql jar 。
如果执行此脚本时 ES 中不存在索引,则会自动创建索引。就像对 elasticsearch 的普通帖子调用一样
最后我能够找到答案。分享我的发现。
要将 ElasticSearch 与 Mysql 一起使用,您将需要 Java 数据库连接 ( JDBC ) 导入器。使用 JDBC 驱动程序,您可以将 mysql 数据同步到 elasticsearch。
我使用的是 ubuntu 14.04 LTS,你需要安装 Java8 才能运行 elasticsearch,因为它是用 Java 编写的
以下是安装ElasticSearch 2.2.0 和 ElasticSearch-jdbc 2.2.0的步骤,请注意两个版本必须相同
安装Java8后.....安装elasticsearch 2.2.0如下
# cd /opt
# wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.2.0/elasticsearch-2.2.0.deb
# sudo dpkg -i elasticsearch-2.2.0.deb
此安装过程将在 /usr/share/elasticsearch/ 中安装 Elasticsearch,其配置文件将放置在 /etc/elasticsearch 中。
现在让我们在配置文件中做一些基本的配置。这里 /etc/elasticsearch/elasticsearch.yml 是我们的配置文件,您可以打开文件进行更改
nano /etc/elasticsearch/elasticsearch.yml
并更改集群名称和节点名称
例如 :
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: servercluster
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: vps.server.com
#
# Add custom attributes to the node:
#
# node.rack: r1
现在保存文件并启动elasticsearch
/etc/init.d/elasticsearch start
测试 ES 安装或不运行以下
curl -XGET 'http://localhost:9200/?pretty'
如果你得到关注,那么你的弹性搜索现在就安装好了:)
{
"name" : "vps.server.com",
"cluster_name" : "servercluster",
"version" : {
"number" : "2.2.0",
"build_hash" : "8ff36d139e16f8720f2947ef62c8167a888992fe",
"build_timestamp" : "2016-01-27T13:32:39Z",
"build_snapshot" : false,
"lucene_version" : "5.4.1"
},
"tagline" : "You Know, for Search"
}
现在让我们安装elasticsearch-JDBC
从 /etc/elasticsearch/ 中下载http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/2.3.3.1/elasticsearch-jdbc-2.3.3.1-dist.zip
并提取相同的内容并在那里创建“日志”文件夹(日志路径应该是 /etc/elasticsearch/logs)
我在 mysql 中创建了一个名为“ ElasticSearchDatabase ”的数据库,在该表中创建了一个名为“test”的表,其中包含字段 id、name 和 email
cd /etc/elasticsearch
并运行以下
echo '{
"type":"jdbc",
"jdbc":{
"url":"jdbc:mysql://localhost:3306/ElasticSearchDatabase",
"user":"root",
"password":"",
"sql":"SELECT id as _id, id, name,email FROM test",
"index":"users",
"type":"users",
"autocommit":"true",
"metrics": {
"enabled" : true
},
"elasticsearch" : {
"cluster" : "servercluster",
"host" : "localhost",
"port" : 9300
}
}
}' | java -cp "/etc/elasticsearch/elasticsearch-jdbc-2.2.0.0/lib/*" -"Dlog4j.configurationFile=file:////etc/elasticsearch/elasticsearch-jdbc-2.2.0.0/bin/log4j2.xml" "org.xbib.tools.Runner" "org.xbib.tools.JDBCImporter"
现在检查是否在 ES 中导入了 mysql 数据
curl -XGET http://localhost:9200/users/_search/?pretty
如果一切顺利,您将能够以 json 格式查看所有 mysql 数据,如果有任何错误,您将能够在 /etc/elasticsearch/logs/jdbc.log 文件中看到它们
注意:
在旧版本的 ES ... 中使用了插件Elasticsearch-river-jdbc ,该插件在最新版本中已完全弃用,因此不要使用它。
我希望我能节省你的时间:)
任何进一步的想法表示赞赏
logstash JDBC 插件将完成这项工作:
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://localhost:3306/testdb"
jdbc_user => "root"
jdbc_password => "factweavers"
# The path to our downloaded jdbc driver
jdbc_driver_library => "/home/comp/Downloads/mysql-connector-java-5.1.38.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
# our query
schedule => "* * * *"
statement => "SELECT" * FROM testtable where Date > :sql_last_value order by Date"
use_column_value => true
tracking_column => Date
}
output {
stdout { codec => json_lines }
elasticsearch {
"hosts" => "localhost:9200"
"index" => "test-migrate"
"document_type" => "data"
"document_id" => "%{personid}"
}
}
为了使它更简单,我创建了一个 PHP 类来使用 Elasticsearch 设置 MySQL。使用 my Class,您可以在 elasticsearch 中同步 MySQL 数据,还可以执行全文搜索。您只需要设置您的 SQL 查询,然后类将为您完成剩下的工作。