web-dev-qa-db-fra.com

ElasticSearch comment s'intégrer à Mysql

Dans l'un de mes projets, je prévois d'utiliser ElasticSearch avec mysql. J'ai installé avec succès ElasticSearch. Je suis capable de gérer l'index dans ES séparément. mais je ne sais pas comment implémenter la même chose avec mysql.

J'ai lu quelques documents mais je suis un peu confus et je n'ai pas d'idée claire. Est-ce que quelqu'un peut m'aider s'il vous plait?

Merci d'avance.

53
Yaxita Shah

Enfin, j'ai pu trouver la réponse. partager mes découvertes.

Pour utiliser ElasticSearch avec Mysql, vous aurez besoin de l’importateur Java Database Connection (JDBC). avec les pilotes JDBC, vous pouvez synchroniser vos données mysql avec elasticsearch.

J'utilise Ubuntu 14.04 LTS et vous devrez installer Java8 pour exécuter elasticsearch tel qu'il est écrit en Java.

voici les étapes à suivre pour installer ElasticSearch 2.2.0 et ElasticSearch-jdbc 2.2. et notez svp les deux versions doivent être identiques

après avoir installé Java8 ..... installez elasticsearch 2.2.0 comme suit

_# 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
_

Cette procédure d'installation installera Elasticsearch dans/usr/share/elasticsearch/dont les fichiers de configuration seront placés dans/etc/elasticsearch.

Maintenant, faisons une configuration de base dans le fichier de configuration. ici /etc/elasticsearch/elasticsearch.yml est notre fichier de configuration que vous pouvez ouvrir fichier pour le changer par

_nano /etc/elasticsearch/elasticsearch.yml
_

et changer le nom du cluster et le nom du noeud

Par exemple :

_# ---------------------------------- 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
_

Maintenant, enregistrez le fichier et lancez elasticsearch

_ /etc/init.d/elasticsearch start
_

pour tester ES installé ou ne pas exécuter après

_ curl -XGET 'http://localhost:9200/?pretty'
_

Si vous obtenez ce qui suit, elasticsearch est installé maintenant :)

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

Maintenant, installons elasticsearch-JDBC

téléchargez-le à partir de http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/2.3.3.1/elasticsearch-jdbc-2.3.3.1-dist.Zip et extrayez-le dans/etc/elasticsearch/et créez également le dossier "logs" (le chemin des journaux doit être/etc/elasticsearch/logs)

J'ai une base de données créée dans mysql ayant le nom "ElasticSearchDatabase" et à l'intérieur de celle-ci table nommée "test" avec les champs id, name et email

_cd /etc/elasticsearch
_

et courir après

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

vérifiez maintenant si les données mysql importées dans ES ou non

_curl -XGET http://localhost:9200/users/_search/?pretty
_

Si tout se passe bien, vous pourrez voir toutes vos données mysql au format json et si une erreur se produit, vous pourrez les voir dans le fichier /etc/elasticsearch/logs/jdbc.log.

Attention:

Dans les anciennes versions d'ES ... le plugin Elasticsearch-river-jdbc était complètement obsolète dans la dernière version. Ne l'utilisez donc pas.

J'espère que je pourrais économiser votre temps :)

Toute autre pensée est appréciée

URL de référence: https://github.com/jprante/elasticsearch-jdbc

41
Yaxita Shah

Depuis ES 5.x, cette fonctionnalité a été fournie avec le plugin logstash .

Cela importera périodiquement les données de la base de données et du serveur Push to ES.

Il faut créer un simple fichier d'importation donné ci-dessous (qui est également décrit ici ) et utiliser logstash pour exécuter le script. Logstash prend en charge l'exécution de ce script selon un planning.

# 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

Vous pouvez télécharger le bocal mysql de maven ici .

Si les index n'existent pas dans ES lorsque ce script est exécuté, ils seront créés automatiquement. Tout comme un appel normal à elasticsearch

60
Nikhil Sahu

Le plugin JDBC logstash fera le travail:

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
Ijaz Ahmad Khan

Pour simplifier les choses, j'ai créé une classe PHP dans Setup MySQL avec Elasticsearch . En utilisant my Class, vous pouvez synchroniser vos données MySQL dans elasticsearch et effectuer également une recherche en texte intégral. Vous avez juste besoin de définir votre requête SQL et la classe fera le reste pour vous.

1
Ahmed Khan