ElasticSearch如何与Mysql集成

时间:2016-03-22 10:40:16

标签: mysql elasticsearch logstash elasticsearch-plugin elasticsearch-5

在我的一个项目中,我计划将ElasticSearch与mysql一起使用。 我已经成功安装了ElasticSearch。我能够分别管理ES中的索引。但我不知道如何用mysql实现相同的功能。

我已阅读了几份文件,但我有点困惑,没有明确的想法。有人可以帮帮我吗?

提前致谢。

6 个答案:

答案 0 :(得分:56)

从ES 5.x开始,他们已经使用logstash插件开箱即用。

这将定期从数据库导入数据并推送到ES服务器。

必须创建一个下面给出的简单导入文件(也称为here)并使用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 here下载mysql jar。

如果执行此脚本时ES中不存在索引,则会自动创建它们。就像对弹性搜索的普通邮件调用一样

答案 1 :(得分:40)

最后我能找到答案。分享我的发现。

要将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'

如果您获得了以下内容,那么现在就安装了elasticsearch:)

{
  "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

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"文件夹也在那里(日志的路径应该是/ etc / elasticsearch / logs)

我在mysql中创建了一个名为" ElasticSearchDatabase "并在表中命名"测试" ,包含字段ID,名称和电子邮件

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 ,在最新版本中已完全弃用,因此请勿使用它。

我希望我能节省你的时间:)

赞赏任何进一步的想法

参考网址:https://github.com/jprante/elasticsearch-jdbc

答案 2 :(得分:3)

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}"
  }
}

答案 3 :(得分:1)

为了使它更简单,我已经为Setup MySQL with Elasticsearch创建了一个PHP类。使用我的类,您可以在elasticsearch中同步MySQL数据,还可以执行全文搜索。您只需要设置SQL查询,类就会为您完成剩下的工作。

答案 4 :(得分:-1)

在2018年,您可以使用“ L4弹性数据迁移工具”

将MySQL迁移到Elastic的最佳方法:L4数据迁移工具:here

在很多情况下,它尝试将数据从关系数据库迁移到REST API或消息队列或JDBC。

但是,在使用Elasticsearch三年之后,我意识到这是一种愚蠢的方式。

我需要另一种方式。上面的链接会有所帮助。

答案 5 :(得分:-2)

官方Elasticsearch php客户端可在以下网址找到:

https://github.com/elastic/elasticsearch-php

如果您想了解有关PHP中Elasticsearch的更多信息,请阅读以下内容:

https://www.elastic.co/guide/en/elasticsearch/client/php-api/2.0/index.html