Como usar o Elasticsearch com o MongoDB?

Já passei por muitos blogs e sites sobre como configurar o Elasticsearch para o MongoDB para indexar Coleções no MongoDB, mas nenhum deles foi direto.

Por favor, explique-me um processo passo a passo para instalar o elasticsearch, que deve include:

  • configuração
  • executado no navegador

Estou usando o Node.js com o express.js, então, por favor, ajude de acordo.

Essa resposta deve ser suficiente para você configurar para seguir este tutorial sobre como criar um componente de pesquisa funcional com MongoDB, Elasticsearch e AngularJS .

Se você deseja usar a pesquisa facetada com dados de uma API, então o BirdWatch Repo da Matthiasn é algo que você pode querer ver.

Então, aqui está como você pode configurar um “cluster” Elasticsearch de um único nó para indexar o MongoDB para uso em um aplicativo NodeJS, Express em uma nova instância do EC2 Ubuntu 14.04.

Certifique-se de que tudo esteja atualizado.

sudo apt-get update 

Instale o NodeJS.

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

Instale o MongoDB – Essas etapas são diretamente dos documentos do MongoDB. Escolha qualquer versão que você esteja confortável. Eu estou furando com v2.4.9 porque parece ser a versão mais recente que o MongoDB-River suporta sem problemas.

Importe a chave GPG pública do MongoDB.

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

Atualize sua lista de fonts.

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

Obtenha o pacote 10gen.

 sudo apt-get install mongodb-10gen 

Em seguida, escolha sua versão se não quiser a mais recente. Se você estiver configurando seu ambiente em uma máquina com Windows 7 ou 8, mantenha-se longe da v2.6 até que eles funcionem com alguns bugs executando-os como um serviço.

 apt-get install mongodb-10gen=2.4.9 

Evitar que a versão da sua instalação do MongoDB seja acelerada quando você atualizar.

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

Inicie o serviço MongoDB.

 sudo service mongodb start 

Seus arquivos de database são padronizados para / var / lib / mongo e seus arquivos de log para / var / log / mongo.

Crie um database através do shell mongo e insira alguns dados fictícios nele.

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

Agora para converter o MongoDB autônomo em um conjunto de réplicas .

Primeiro desligue o processo.

 mongo YOUR_DATABASE_NAME use admin db.shutdownServer() 

Agora estamos executando o MongoDB como um serviço, portanto, não passamos na opção "--replSet rs0" no argumento da linha de comando quando reiniciamos o processo mongod. Em vez disso, colocamos no arquivo mongod.conf.

 vi /etc/mongod.conf 

Adicione estas linhas, substituindo seus caminhos de log e db.

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

Agora abra o shell mongo novamente para inicializar o 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. 

Agora instale o Elasticsearch. Eu só estou seguindo essa essência útil.

Certifique-se de que o Java esteja instalado.

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

Fique com a v1.1.x por enquanto até que o bug do plugin Mongo-River seja corrigido na 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 

Certifique-se de que /etc/elasticsearch/elasticsearch.yml tenha as seguintes opções de configuração ativadas se você estiver desenvolvendo em um único nó por enquanto:

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

Inicie o serviço Elasticsearch.

 sudo service elasticsearch start 

Verifique se está funcionando.

 curl http://localhost:9200 

Se você vê algo assim, então você é bom.

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

Agora instale os plugins do Elasticsearch para que ele possa tocar com o MongoDB.

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

Esses dois plugins não são necessários, mas são bons para testar consultas e visualizar alterações em seus índices.

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

Reinicie o Elasticsearch.

 sudo service elasticsearch restart 

Finalmente, indexe uma coleção do 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 se o seu índice está no Elasticsearch

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

Verifique a integridade do seu cluster.

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

É provavelmente amarelo com alguns fragments não atribuídos. Temos que dizer ao Elasticsearch com o que queremos trabalhar.

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

Verifique a integridade do cluster novamente. Deve ser verde agora.

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

Vá brincar.

Usar o river pode apresentar problemas quando sua operação aumenta. River usará uma tonelada de memory quando estiver em operação pesada. Eu recomendo implementar seus próprios modelos de elasticsearch, ou se você estiver usando mongoose, você pode construir seus modelos de elasticsearch diretamente nisto ou usar mongoosastic que basicamente faz isso para você.

Outra desvantagem do Mongodb River é que você ficará preso usando o branch mongodb 2.4.x, e o ElasticSearch 0.90.x. Você começará a descobrir que está perdendo muitos resources realmente interessantes, e o projeto do rio mongodb simplesmente não produz um produto utilizável rápido o suficiente para se manter estável. Isso disse que o Rio Mongodb definitivamente não é algo com o qual eu entraria em produção. Coloca mais problemas do que vale a pena. Ele soltará aleatoriamente a gravação sob carga pesada, consumirá muita memory e não há nenhuma configuração para limitar isso. Além disso, o river não é atualizado em tempo real, ele lê os oplogs do mongodb e isso pode atrasar as atualizações por até cinco minutos na minha experiência.

Recentemente, tivemos que rewrite uma grande parte do nosso projeto, porque é uma ocorrência semanal que algo dá errado com o ElasticSearch. Chegamos até a contratar um consultor da Dev Ops, que também concorda que é melhor se afastar de River.

ATUALIZAÇÃO: O Elasticsearch-mongodb-river agora suporta ES v1.4.0 e mongodb v2.6.x. No entanto, você provavelmente ainda terá problemas de desempenho em operações pesadas de inserção / atualização, pois este plugin tentará ler os oplogs do mongodb para sincronizar. Se houver muitas operações desde que o bloqueio (ou trava) é desbloqueado, você notará um uso de memory extremamente alto em seu servidor elasticsearch. Se você planeja ter uma grande operação, o rio não é uma boa opção. Os desenvolvedores do ElasticSearch ainda recomendam que você gerencie seus próprios índices comunicando-se diretamente com a API deles usando a biblioteca do cliente para o seu idioma, em vez de usar o river. Este não é realmente o objective do rio. O Twitter-river é um ótimo exemplo de como o rio deve ser usado. É essencialmente uma ótima maneira de obter dados de fonts externas, mas não é muito confiável para tráfego intenso ou uso interno.

Considere também que o rio Mongongb fica para trás na versão, como não é mantido pela Organização ElasticSearch, é mantido por uma terceira parte. O desenvolvimento ficou preso na v0.90 branch por um longo tempo após o lançamento da v1.0, e quando uma versão para a v1.0 foi lançada, não ficou estável até o lançamento do elasticsearch v1.3.0. Versões do Mongodb também ficam para trás. Você pode encontrar-se em uma situação difícil quando você está olhando para mover para uma versão posterior de cada um, especialmente com ElasticSearch sob desenvolvimento tão pesado, com muitos resources muito esperados no caminho. Manter-se atualizado sobre o mais recente ElasticSearch tem sido muito importante, pois dependemos muito da constante melhoria de nossa funcionalidade de pesquisa, pois é parte fundamental de nosso produto.

Tudo em tudo, você provavelmente irá obter um produto melhor se você fizer isso sozinho. Não é tão difícil. É apenas outro database para gerenciar em seu código, e pode ser facilmente descartado em seus modelos existentes sem grandes refatorações.

Eu achei mongo-conector útil. É o formulário Mongo Labs (MongoDB Inc.) e pode ser usado agora com o Elasticsearch 2.x

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

O mongo-connector cria um pipeline de um cluster MongoDB para um ou mais sistemas de destino, como Solr, Elasticsearch ou outro cluster do MongoDB. Ele sincroniza os dados no MongoDB para o destino e depois coroa o oplog do MongoDB, acompanhando as operações no MongoDB em tempo real. Foi testado com o Python 2.6, 2.7 e 3.3+. Documentação detalhada está disponível no wiki.

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

Aqui como fazer isso no mongodb 3.0. Eu usei esse blog legal

  1. Instale o mongodb.
  2. Crie diretórios de dados:
 $ mkdir RANDOM_PATH/node1 $ mkdir RANDOM_PATH/node2> $ mkdir RANDOM_PATH/node3 
  1. Iniciar instâncias do Mongod
 $ mongod --replSet test --port 27021 --dbpath node1 $ mongod --replSet test --port 27022 --dbpath node2 $ mongod --replSet test --port 27023 --dbpath node3 
  1. Configurar o conjunto de réplicas:
 $ mongo config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]}; rs.initiate(config); 
  1. Instalando o 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. Instalando e configurando o rio MongoDB:

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

$ bin / plugin – instala elasticsearch / elasticsearch-mapper-attachments

  1. Crie o “rio” e o índice:

curl -XPUT ‘ http: // localhost: 8080 / _river / mongodb / _meta ‘ -d ‘{“tipo”: “mongodb”, “mongodb”: {“db”: “mydb”, “coleção”: “foo” }, “index”: {“name”: “nome”, “tipo”: “random”}} ‘

  1. Teste no navegador:

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

Como o mongo-connector agora parece morto, minha empresa decidiu criar uma ferramenta para usar os streams de alteração do Mongo para exportar para o Elasticsearch.

Nossos resultados iniciais parecem promissores. Você pode conferir em https://github.com/everyone-counts/mongo-stream . Ainda estamos no início do desenvolvimento e gostaríamos de receber sugestões ou contribuições.

River é uma boa solução uma vez que você queira ter uma synchronization e solução geral quase em tempo real.

Se você já tem dados no MongoDB e quer enviá-los facilmente para o Elasticsearch como “one-shot”, você pode tentar o meu pacote em Node.js https://github.com/itemsapi/elasticbulk .

Ele está usando streams do Node.js para que você possa importar dados de tudo o que está suportando streams (por exemplo, MongoDB, PostgreSQL, MySQL, arquivos JSON, etc)

Exemplo para o MongoDB para o Elasticsearch:

Instalar pacotes:

 npm install elasticbulk npm install mongoose npm install bluebird 

Criar script, ou seja, 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'); }) 

Envie seus dados:

 node script.js 

Não é extremamente rápido, mas está funcionando para milhões de registros (graças aos streams).