to - ¿Cómo usar Elasticsearch con MongoDB?




sync kibana (6)

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.


Answers

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).


Usar el río puede presentar problemas cuando su operación aumenta. River usará una tonelada de memoria cuando se encuentre bajo una operación pesada. Recomiendo implementar tus propios modelos de mongoosastic , o si estás usando mangosta puedes construir tus modelos de mongoosastic directamente en eso o usar mongoosastic que esencialmente hace esto por ti.

Otra desventaja de Mongodb River es que te quedarás atrapado utilizando la rama mongodb 2.4.x y ElasticSearch 0.90.x. Comenzará a darse cuenta de que se está perdiendo muchas características realmente agradables, y el proyecto del río mongodb simplemente no produce un producto utilizable lo suficientemente rápido como para mantenerse estable. Eso dijo que Mongodb River definitivamente no es algo con lo que comenzaría la producción. Ha planteado más problemas que su valor. Se escribirá al azar bajo carga pesada, consumirá mucha memoria, y no hay ninguna configuración para limitar eso. Además, river no se actualiza en tiempo real, lee oplogs de mongodb, y esto puede demorar las actualizaciones por hasta 5 minutos en mi experiencia.

Recientemente tuvimos que reescribir una gran parte de nuestro proyecto, porque es una ocurrencia semanal que algo sale mal con ElasticSearch. Incluso habíamos llegado a contratar un consultor de Dev Ops, quien también está de acuerdo en que es mejor alejarse de River.

ACTUALIZACIÓN: Elasticsearch-mongodb-river ahora es compatible con ES v1.4.0 y mongodb v2.6.x. Sin embargo, es probable que se encuentre con problemas de rendimiento en las operaciones pesadas de inserción / actualización ya que este complemento intentará leer los oplogs de mongodb para sincronizar. Si hay muchas operaciones desde que se desbloquea el bloqueo (o bloqueo), notará un uso de memoria extremadamente alto en su servidor de búsqueda elástica. Si planea tener una operación grande, el río no es una buena opción. Los desarrolladores de ElasticSearch aún recomiendan que administre sus propios índices comunicándose directamente con su API utilizando la biblioteca del cliente para su idioma, en lugar de utilizar el río. Este no es realmente el propósito del río. Twitter-river es un gran ejemplo de cómo se debe usar el río. Es esencialmente una excelente forma de obtener datos de fuentes externas, pero no es muy confiable para alto tráfico o uso interno.

También tenga en cuenta que mongodb-river se queda atrás en la versión, ya que no es mantenido por ElasticSearch Organization, es mantenido por una tercera parte. El desarrollo estuvo atascado en la rama v0.90 durante mucho tiempo después del lanzamiento de v1.0, y cuando se lanzó una versión para v1.0, no fue estable hasta que elasticsearch lanzó v1.3.0. Las versiones de Mongodb también se quedan atrás. Es posible que se encuentre en una situación difícil cuando quiera pasar a una versión posterior de cada uno, especialmente con ElasticSearch en un desarrollo tan complicado, con muchas características muy anticipadas en el camino. Mantenerse al día con la última versión de ElasticSearch ha sido muy importante ya que dependemos en gran medida de mejorar constantemente nuestra funcionalidad de búsqueda ya que es una parte fundamental de nuestro producto.

En general, es probable que obtenga un mejor producto si lo hace usted mismo. No es tan difícil. Es solo otra base de datos para administrar en su código, y se puede agregar fácilmente a sus modelos existentes sin refactorización importante.


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.


Encontré mongo-connector útil. Es de Mongo Labs (MongoDB Inc.) y se puede usar ahora con Elasticsearch 2.x

Elástico 2.x doc manager: https://github.com/mongodb-labs/elastic2-doc-manager

mongo-connector crea una canalización desde un clúster MongoDB a uno o más sistemas de destino, como Solr, Elasticsearch u otro clúster MongoDB. Sincroniza los datos en MongoDB con el objetivo, luego sigue el oplog de MongoDB, manteniéndose al día con las operaciones en MongoDB en tiempo real. Ha sido probado con Python 2.6, 2.7 y 3.3+. La documentación detallada está disponible en la wiki.

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


En MongoDB, el orden de los campos en un documento es realmente significativo, y todos los controladores de idioma proporcionan un medio para especificar los documentos de esa manera, incluso si el lenguaje de programación subyacente no tiene ese concepto.

El formato de documento que utiliza MongoDB en su shell es similar a JSON pero no a JSON estricto. Entre otras cosas, el orden de los campos siempre se conserva.

En Javascript, el estándar define los campos como desordenados, por lo que las implementaciones son libres de ignorar / no conservar el orden. Pero en la práctica, todas las implementaciones preservan el orden. En particular, el V8 engine conserva el ordenamiento, que es el motor utilizado en node.js por lo que no es un problema.





mongodb elasticsearch