mongodb to elasticsearch sync




¿Cómo usar Elasticsearch con MongoDB? (4)

He revisado muchos blogs y sitios sobre cómo configurar Elasticsearch para MongoDB para indexar colecciones en MongoDB, pero ninguno de ellos era sencillo.

Explíqueme un proceso paso a paso para instalar elasticsearch, que debe incluir:

  • configuración
  • ejecutar en el navegador

Estoy usando Node.js con express.js, así que por favor ayuda en consecuencia.


Aquí cómo hacer esto en mongodb 3.0. Usé este buen blog

  1. Instala mongodb.
  2. Crear directorios de datos:
$ mkdir RANDOM_PATH/node1
$ mkdir RANDOM_PATH/node2> 
$ mkdir RANDOM_PATH/node3
  1. Comience las instancias de Mongod
$ mongod --replSet test --port 27021 --dbpath node1
$ mongod --replSet test --port 27022 --dbpath node2
$ mongod --replSet test --port 27023 --dbpath node3
  1. Configurar el conjunto de réplicas:
$ mongo
config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]};    
rs.initiate(config);
  1. Instalando 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. Instalación y configuración del río MongoDB:

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

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

  1. Crea el "río" y el índice:

curl -XPUT ' http://localhost:8080/_river/mongodb/_meta ' -d '{"tipo": "mongodb", "mongodb": {"db": "mydb", "colección": "foo" }, "índice": {"nombre": "nombre", "tipo": "aleatorio"}} '

  1. Prueba en el navegador:

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


Como mongo-connector ahora parece estar muerto, mi empresa decidió crear una herramienta para usar las transmisiones de cambio de Mongo para enviarlas a Elasticsearch.

Nuestros resultados iniciales parecen prometedores. Puede verificarlo en https://github.com/everyone-counts/mongo-stream . Todavía estamos en una etapa temprana de desarrollo y agradeceríamos sugerencias o aportes.


Esta respuesta debería ser suficiente para configurarlo para seguir este tutorial sobre Creación de un componente de búsqueda funcional con MongoDB, Elasticsearch y AngularJS .

Si está buscando utilizar la búsqueda facetada con datos de una API, BirdWatch Repo de Matthiasn es algo que tal vez quiera consultar.

Así es como puede configurar un "clúster" Elasticsearch de un solo nodo para indexar MongoDB y utilizarlo en una aplicación NodeJS Express en una nueva instancia EC2 Ubuntu 14.04.

Asegúrese de que todo esté actualizado.

sudo apt-get update

Instalar NodeJS.

sudo apt-get install nodejs
sudo apt-get install npm

Instale MongoDB : estos pasos son directamente desde los documentos de MongoDB. Elija la versión con la que se sienta cómodo. Me estoy quedando con v2.4.9 porque parece ser la versión más reciente que MongoDB-River admite sin problemas.

Importe la clave GPG pública de MongoDB.

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

Actualiza tu lista de fuentes.

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

Obtenga el paquete 10gen.

sudo apt-get install mongodb-10gen

A continuación, elija su versión si no desea la más reciente. Si está configurando su entorno en una máquina Windows 7 u 8, aléjese de v2.6 hasta que solucionen algunos errores al ejecutarlo como un servicio.

apt-get install mongodb-10gen=2.4.9

Evite que la versión de su instalación de MongoDB se incremente cuando actualice.

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

Inicie el servicio MongoDB.

sudo service mongodb start

Sus archivos de base de datos por defecto son / var / lib / mongo y sus archivos de registro a / var / log / mongo.

Crea una base de datos a través del shell mongo e inserta algunos datos ficticios en ella.

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

Ahora para convertir el MongoDB independiente en un conjunto de réplicas .

Primero cierre el proceso.

mongo YOUR_DATABASE_NAME
use admin
db.shutdownServer()

Ahora estamos ejecutando MongoDB como un servicio, por lo que no pasamos la opción "--replSet rs0" en el argumento de la línea de comando cuando reiniciamos el proceso mongod. En cambio, lo colocamos en el archivo mongod.conf.

vi /etc/mongod.conf

Agregue estas líneas, sustituyendo sus rutas de registro y db.

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

Ahora abre el shell mongo nuevamente para inicializar el conjunto 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.

Ahora instala Elasticsearch. Solo estoy siguiendo esta útil Gist .

Asegúrese de que Java esté instalado.

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

Quédate con v1.1.x por ahora hasta que se solucione el error del complemento Mongo-River en 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

Asegúrese de que /etc/elasticsearch/elasticsearch.yml tenga activadas las siguientes opciones de configuración si solo está desarrollando en un solo nodo por el momento:

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

Inicie el servicio Elasticsearch.

sudo service elasticsearch start

Verifica que está funcionando.

curl http://localhost:9200

Si ves algo así, entonces estás bien.

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

Ahora instala los complementos de Elasticsearch para que pueda jugar con MongoDB.

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

Estos dos complementos no son necesarios, pero son buenos para probar consultas y visualizar cambios en sus índices.

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

Reinicie Elasticsearch.

sudo service elasticsearch restart

Finalmente indexe una colección 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"
  }
}'

Verifique que su índice esté en Elasticsearch

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

Verifica el estado de tu cluster.

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

Es probable que sea amarillo con algunos fragmentos no asignados. Tenemos que decirle a Elasticsearch con qué queremos trabajar.

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

Verifique la salud del cluster nuevamente. Debería ser verde ahora.

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

Ir a jugar.


River es una buena solución una vez que quieres tener una sincronización general y una solución general casi en tiempo real.

Si ya tiene datos en MongoDB y desea enviarlos fácilmente a Elasticsearch como "one-shot", puede probar mi paquete en Node.js https://github.com/itemsapi/elasticbulk .

Está utilizando transmisiones de Node.js para que pueda importar datos de todo lo que admite flujos (es decir, MongoDB, PostgreSQL, MySQL, archivos JSON, etc.)

Ejemplo para MongoDB a Elasticsearch:

Instalar paquetes:

npm install elasticbulk
npm install mongoose
npm install bluebird

Crear secuencia de comandos, es decir, 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');
})

Envíe sus datos:

node script.js

No es extremadamente rápido, pero funciona para millones de registros (gracias a las transmisiones).





elasticsearch