web-dev-qa-db-fra.com

Comment utiliser Elasticsearch avec MongoDB?

J'ai consulté de nombreux blogs et sites sur la configuration d'Elasticsearch for MongoDB pour indexer les collections dans MongoDB, mais aucun d'entre eux n'était simple.

Veuillez m'expliquer un processus étape par étape pour l'installation d'elasticsearch, qui devrait inclure:

  • configuration 
  • courir dans le navigateur

J'utilise Node.js avec express.js, alors aidez-nous en conséquence.

114
bibin david

Cette réponse devrait suffire à vous permettre de suivre ce didacticiel sur Création d’un composant de recherche fonctionnel avec MongoDB, Elasticsearch et AngularJS .

Si vous souhaitez utiliser la recherche à facettes avec les données d'une API, alors le BirdWatch Repo de Matthiasn est quelque chose que vous voudrez peut-être examiner.

Alors, voici comment vous pouvez configurer un "cluster" Elasticsearch à un seul noeud pour indexer MongoDB afin de l'utiliser dans une application NodeJS Express Express sur une nouvelle instance EC2 Ubuntu 14.04.

Assurez-vous que tout est à jour.

Sudo apt-get update

Installez NodeJS.

Sudo apt-get install nodejs
Sudo apt-get install npm

Installez MongoDB - Ces étapes proviennent directement de la documentation MongoDB ..__ Choisissez la version avec laquelle vous êtes à l'aise. Je m'en tiens à la v2.4.9 car il semble que ce soit la version la plus récente MongoDB-River prend en charge sans problème.

Importez la clé publique GPG de MongoDB.

Sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

Mettez à jour votre liste de sources.

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | Sudo tee /etc/apt/sources.list.d/mongodb.list

Obtenez le paquet 10gen.

Sudo apt-get install mongodb-10gen

Ensuite, choisissez votre version si vous ne voulez pas la plus récente. Si vous configurez votre environnement sur une machine Windows 7 ou 8, restez à l’écart de la v2.6 jusqu’à ce qu’ils résolvent certains problèmes lors de son exécution en tant que service.

apt-get install mongodb-10gen=2.4.9

Empêchez la version de votre installation MongoDB d'être modifiée lors de la mise à jour.

echo "mongodb-10gen hold" | Sudo dpkg --set-selections

Démarrez le service MongoDB.

Sudo service mongodb start

Vos fichiers de base de données sont définis par défaut sur/var/lib/mongo et vos fichiers journaux sur/var/log/mongo.

Créez une base de données via le shell mongo et introduisez-y des données factices.

mongo YOUR_DATABASE_NAME
db.createCollection(YOUR_COLLECTION_NAME)
for (var i = 1; i <= 25; i++) db.YOUR_COLLECTION_NAME.insert( { x : i } )

Maintenant pour Convertissez la MongoDB autonome en un jeu de répliques .

D'abord arrêter le processus.

mongo YOUR_DATABASE_NAME
use admin
db.shutdownServer()

Nous utilisons maintenant MongoDB en tant que service. Par conséquent, nous ne transmettons pas l'option "--replSet rs0" dans l'argument de ligne de commande lorsque nous relançons le processus mongod. Au lieu de cela, nous le mettons dans le fichier mongod.conf.

vi /etc/mongod.conf

Ajoutez ces lignes en sous-traitant vos chemins de la base de données et du journal.

replSet=rs0
dbpath=YOUR_PATH_TO_DATA/DB
logpath=YOUR_PATH_TO_LOG/MONGO.LOG

Ouvrez à nouveau le shell mongo pour initialiser le jeu de réplicas.

mongo DATABASE_NAME
config = { "_id" : "rs0", "members" : [ { "_id" : 0, "Host" : "127.0.0.1:27017" } ] }
rs.initiate(config)
rs.slaveOk() // allows read operations to run on secondary members.

Maintenant, installez Elasticsearch. Je ne fais que suivre cette information utile Gist .

Assurez-vous que Java est installé.

Sudo apt-get install openjdk-7-jre-headless -y

Restez avec v1.1.x pour le moment jusqu'à ce que le bogue du plugin Mongo-River soit corrigé dans la v1.2.1.

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.1.1.deb
Sudo dpkg -i elasticsearch-1.1.1.deb

curl -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
Sudo mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
Sudo rm -Rf *servicewrapper*
Sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
Sudo ln -s `readlink -f /usr/local/share/elasticsearch/bin/service/elasticsearch` /usr/local/bin/rcelasticsearch

Assurez-vous que /etc/elasticsearch/elasticsearch.yml a les options de configuration suivantes activées si vous ne développez que sur un seul nœud pour l'instant:

cluster.name: "MY_CLUSTER_NAME"
node.local: true

Démarrez le service Elasticsearch.

Sudo service elasticsearch start

Vérifiez que ça fonctionne.

curl http://localhost:9200

Si vous voyez quelque chose comme ça, alors vous êtes bon.

{
  "status" : 200,
  "name" : "Chi Demon",
  "version" : {
    "number" : "1.1.2",
    "build_hash" : "e511f7b28b77c4d99175905fac65bffbf4c80cf7",
    "build_timestamp" : "2014-05-22T12:27:39Z",
    "build_snapshot" : false,
    "lucene_version" : "4.7"
  },
  "tagline" : "You Know, for Search"
}

Maintenant, installez les plugins Elasticsearch afin qu’il puisse jouer avec MongoDB.

bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/1.6.0
bin/plugin --install elasticsearch/elasticsearch-mapper-attachments/1.6.0

Ces deux plugins ne sont pas nécessaires, mais ils sont utiles pour tester les requêtes et visualiser les modifications apportées à vos index.

bin/plugin --install mobz/elasticsearch-head
bin/plugin --install lukas-vlcek/bigdesk

Redémarrez Elasticsearch.

Sudo service elasticsearch restart

Enfin indexez une collection de MongoDB.

curl -XPUT localhost:9200/_river/DATABASE_NAME/_meta -d '{
  "type": "mongodb",
  "mongodb": {
    "servers": [
      { "Host": "127.0.0.1", "port": 27017 }
    ],
    "db": "DATABASE_NAME",
    "collection": "ACTUAL_COLLECTION_NAME",
    "options": { "secondary_read_preference": true },
    "gridfs": false
  },
  "index": {
    "name": "ARBITRARY INDEX NAME",
    "type": "ARBITRARY TYPE NAME"
  }
}'

Vérifiez que votre index est dans Elasticsearch

curl -XGET http://localhost:9200/_aliases

Vérifiez la santé de votre cluster.

curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'

Il est probablement jaune avec des fragments non attribués. Nous devons dire à Elasticsearch avec quoi nous voulons travailler.

curl -XPUT 'localhost:9200/_settings' -d '{ "index" : { "number_of_replicas" : 0 } }'

Vérifiez à nouveau la santé du cluster. Il devrait être vert maintenant.

curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'

Va jouer.

257
Donald Gary

L'utilisation de la rivière peut présenter des problèmes lorsque votre opération évolue. River utilisera une tonne de mémoire lors d'opérations intensives. Je recommande de mettre en œuvre vos propres modèles elasticsearch. Si vous utilisez Mangouste, vous pouvez intégrer vos modèles elasticsearch directement dans celui-ci ou utiliser mongoosastic qui le fait essentiellement pour vous.

Un autre inconvénient de Mongodb River est que vous serez bloqué par les branches mongodb 2.4.x et ElasticSearch 0.90.x. Vous allez commencer à constater que vous manquez de nombreuses fonctionnalités vraiment sympas, et le projet de la rivière Mongodb ne produit tout simplement pas un produit utilisable assez rapidement pour rester stable. Cela dit, la rivière Mongodb n’est certainement pas quelque chose avec lequel je commencerais à produire. Cela pose plus de problèmes que sa valeur. Il va laisser tomber l’écriture de manière aléatoire sous une charge importante, il va consommer beaucoup de mémoire, et il n’ya pas de réglage pour le limiter. De plus, river ne met pas à jour en temps réel, il lit les oplogs de mongodb, ce qui peut retarder les mises à jour jusqu'à 5 minutes, selon mon expérience.

Nous avons récemment dû réécrire une grande partie de notre projet, car il se produit chaque semaine un problème avec ElasticSearch. Nous étions même allés jusqu'à embaucher un consultant pour Dev Ops, qui convient également qu'il est préférable de s'éloigner de River.

UPDATE: Elasticsearch-mongodb-river prend désormais en charge ES v1.4.0 et mongodb v2.6.x. Cependant, vous rencontrerez probablement des problèmes de performances lors d'opérations d'insertion/mise à jour importantes, car ce plug-in essaiera de lire les journaux d'opérations de mongodb à synchroniser. S'il y a beaucoup d'opérations depuis le déverrouillage du verrou (ou plutôt du verrou), vous remarquerez une utilisation extrêmement importante de la mémoire sur votre serveur elasticsearch. Si vous envisagez une grande opération, la rivière n’est pas une bonne option. Les développeurs d’ElasticSearch vous recommandent toujours de gérer vos propres index en communiquant directement avec leur API en utilisant la bibliothèque cliente de votre langue plutôt qu’en utilisant river. Ce n'est pas vraiment le but de la rivière. Twitter-river est un excellent exemple de la façon dont la rivière devrait être utilisée. Il s’agit essentiellement d’un excellent moyen de générer des données à partir de sources extérieures, mais il n’est pas très fiable pour un trafic intense ou un usage interne.

Considérez également que mongodb-river est en retard dans sa version, car elle n’est pas maintenue par ElasticSearch Organisation, mais par une tierce partie. Le développement a longtemps été bloqué sur la branche v0.90 après la publication de la v1.0. Lorsqu'une version v1.0 a été publiée, elle n'était plus stable jusqu'à la sortie de v1.3.0 par elasticsearch. Les versions de Mongodb sont également en retard. Vous pouvez vous retrouver dans une situation délicate lorsque vous souhaitez passer à une version ultérieure de chacune d’elles, en particulier avec ElasticSearch dans des conditions de développement aussi lourdes, avec de nombreuses fonctionnalités très attendues. Rester informé des dernières évolutions d’ElasticSearch a été très important, car nous comptons beaucoup sur l’amélioration constante de nos fonctionnalités de recherche, qui sont au cœur de notre produit.

Dans l'ensemble, vous obtiendrez probablement un meilleur produit si vous le faites vous-même. Ce n'est pas si difficile. C'est juste une autre base de données à gérer dans votre code, et il peut facilement être inséré dans vos modèles existants sans refactoring majeur.

33
tsturzl

J'ai trouvé mongo-connector utile. Il s'agit de Mongo Labs (MongoDB Inc.) et peut être utilisé maintenant avec Elasticsearch 2.x

Elastic 2.x doc manager: https://github.com/mongodb-labs/elastic2-doc-manager

mongo-connector crée un pipeline d'un cluster MongoDB vers un ou plusieurs systèmes cibles, tels que Solr, Elasticsearch ou un autre cluster MongoDB. Il synchronise les données dans MongoDB avec la cible, puis élimine le journal des opérations MongoDB, assurant ainsi le suivi des opérations dans MongoDB en temps réel. Il a été testé avec Python 2.6, 2.7 et 3.3+. Une documentation détaillée est disponible sur le wiki.

https://github.com/mongodb-labs/mongo-connectorhttps://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch

4
Lokendra Chauhan

Voici comment faire cela sur mongodb 3.0. J'ai utilisé ce Nice blog

  1. Installez mongodb.
  2. Créer des répertoires de données:
$ mkdir RANDOM_PATH/node1
$ mkdir RANDOM_PATH/node2> 
$ mkdir RANDOM_PATH/node3
  1. Démarrer des instances Mongod
$ mongod --replSet test --port 27021 --dbpath node1
$ mongod --replSet test --port 27022 --dbpath node2
$ mongod --replSet test --port 27023 --dbpath node3
  1. Configurez le jeu de réplicas:
$ mongo
config = {_id: 'test', members: [ {_id: 0, Host: 'localhost:27021'}, {_id: 1, Host: 'localhost:27022'}]};    
rs.initiate(config);
  1. Installation d'Elasticsearch: 
a. Download and unzip the [latest Elasticsearch][2] distribution

b. Run bin/elasticsearch to start the es server.

c. Run curl -XGET http://localhost:9200/ to confirm it is working.
  1. Installation et configuration de la rivière MongoDB:

$ bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb

$ bin/plugin --installez elasticsearch/elasticsearch-mapper-attachments

  1. Créez la «rivière» et l'index:

curl -XPUT ' http: // localhost: 8080/_river/mongodb/_meta ' -d '{. "type": "mongodb", "mongodb": { "db": "mydb", "collection": "foo" }, "index": { "nom nom", "type": "aléatoire" } } '

  1. Test sur navigateur: 

    http: // localhost: 9200/_search? q = home

2

Puisque mongo-connector semble maintenant mort, ma société a décidé de créer un outil permettant d'utiliser les flux de modifications Mongo pour les générer vers Elasticsearch.

Nos premiers résultats semblent prometteurs. Vous pouvez le vérifier à https://github.com/everyone-counts/mongo-stream . Nous sommes encore au début du développement et nous serions heureux de recevoir des suggestions ou des contributions.

1
Jud

Ici, j'ai trouvé une autre bonne option pour migrer vos données MongoDB vers Elasticsearch . Un démon actif qui synchronise mongodb sur elasticsearch en temps réel . C'est le Monstache. Son disponible à: Monstache

Ci-dessous le setp initial pour le configurer et l’utiliser.

Étape 1:

C:\Program Files\MongoDB\Server\4.0\bin>mongod --smallfiles --oplogSize 50 --replSet test

Étape 2 :

C:\Program Files\MongoDB\Server\4.0\bin>mongo

C:\Program Files\MongoDB\Server\4.0\bin>mongo
MongoDB Shell version v4.0.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.2
Server has startup warnings:
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
MongoDB Enterprise test:PRIMARY>

Étape 3: vérifiez la réplication.

MongoDB Enterprise test:PRIMARY> rs.status();
{
        "set" : "test",
        "date" : ISODate("2019-01-18T11:39:00.380Z"),
        "myState" : 1,
        "term" : NumberLong(2),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1547811537, 1),
                        "t" : NumberLong(2)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1547811537, 1),
                        "t" : NumberLong(2)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1547811537, 1),
                        "t" : NumberLong(2)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1547811537, 1),
                        "t" : NumberLong(2)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1547811517, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "localhost:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 736,
                        "optime" : {
                                "ts" : Timestamp(1547811537, 1),
                                "t" : NumberLong(2)
                        },
                        "optimeDate" : ISODate("2019-01-18T11:38:57Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1547810805, 1),
                        "electionDate" : ISODate("2019-01-18T11:26:45Z"),
                        "configVersion" : 1,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1547811537, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1547811537, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
MongoDB Enterprise test:PRIMARY>

Étape 4. Téléchargez le fichier " https://github.com/rwynn/monstache/releases " . Décompressez le téléchargement et ajustez votre variable PATH pour inclure le chemin d'accès au dossier de votre plate-forme . Allez à cmd et tapez "monstache -v" # 4.13.1 Monstache utilise le format TOML pour sa configuration. Configurez le fichier de migration nommé config.toml

Étape 5. 

Mon config.toml ->

mongo-url = "mongodb://127.0.0.1:27017/?replicaSet=test"
elasticsearch-urls = ["http://localhost:9200"]

direct-read-namespaces = [ "admin.users" ]

gzip = true
stats = true
index-stats = true

elasticsearch-max-conns = 4
elasticsearch-max-seconds = 5
elasticsearch-max-bytes = 8000000 

dropped-collections = false
dropped-databases = false

resume = true
resume-write-unsafe = true
resume-name = "default"
index-files = false
file-highlighting = false
verbose = true
exit-after-direct-reads = false

index-as-update=true
index-oplog-time=true

Étape 6.

D:\15-1-19>monstache -f config.toml

 Monstache Running...

 Confirm Migrated Data at Elasticsearch

 Add Record at Mongo

 Monstache Captured the event and migrate the data to elasticsearch

0
Abhijit Bashetti

River est une bonne solution lorsque vous souhaitez disposer d’une synchronisation générale et d’une solution générale.

Si vous avez déjà des données dans MongoDB et que vous voulez les envoyer très facilement à Elasticsearch comme "one-shot", vous pouvez essayer mon paquet dans Node.js https://github.com/itemsapi/elasticbulk

Il utilise des flux Node.js pour que vous puissiez importer des données de tout ce qui les supporte (par exemple, MongoDB, PostgreSQL, MySQL, fichiers JSON, etc.).

Exemple pour MongoDB à Elasticsearch:

Installer des paquets:

npm install elasticbulk
npm install mongoose
npm install bluebird

Créer un script c'est-à-dire script.js: 

const elasticbulk = require('elasticbulk');
const mongoose = require('mongoose');
const Promise = require('bluebird');
mongoose.connect('mongodb://localhost/your_database_name', {
  useMongoClient: true
});

mongoose.Promise = Promise;

var Page = mongoose.model('Page', new mongoose.Schema({
  title: String,
  categories: Array
}), 'your_collection_name');

// stream query 
var stream = Page.find({
}, {title: 1, _id: 0, categories: 1}).limit(1500000).skip(0).batchSize(500).stream();

elasticbulk.import(stream, {
  index: 'my_index_name',
  type: 'my_type_name',
  Host: 'localhost:9200',
})
.then(function(res) {
  console.log('Importing finished');
})

Expédiez vos données:

node script.js

Ce n'est pas extrêmement rapide mais cela fonctionne pour des millions d'enregistrements (grâce aux flux).

0
Mateusz Rzepa