Como utilizar a pesquisa elastica com o MongoDB?
já vi muitos blogs e sites sobre como configurar a pesquisa elastica para o MongoDB indexar Coleções em MongoDB, mas nenhum deles era simples.
por favor, explique-me um processo passo a passo para instalar a elasticsearch, que deve incluir:
- Configuração
- Executar no navegador
estou a usar o nó.js com express.js, por favor, ajuda em conformidade.
6 answers
Esta resposta deve ser suficiente para que você se prepare para seguir este tutorial em construir um componente de pesquisa funcional com MongoDB, Elasticsearch, e AngularJS.
Se você está olhando para usar a pesquisa facetada com dados de uma API então Matthiasn Birdwatch Repo é algo que você pode querer ver.
Então, aqui está como você pode configurar um único nó Elasticsearch "cluster" para indexar MongoDB para uso em uma aplicação NodeJS, Express em um novo Ubuntu EC2 14.04 instancia. Certifica-te que está tudo actualizado.sudo apt-get update
Instale NodeJS.
sudo apt-get install nodejs
sudo apt-get install npm
Instale MongoDB - estes passos são direitos dos docs MongoDB. Escolha qualquer versão com que se sinta confortável. Continuo com o v2. 4. 9 porque parece ser a versão mais recente do MongoDB-River suporta sem problemas.
Importar a chave pública MongoDB GPG.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
Actualiza a tua lista de fontes.
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
Traz o 10gen pacote.
sudo apt-get install mongodb-10gen
Então escolha a sua versão se não quiser a mais recente. Se você está configurando o seu ambiente em uma máquina windows 7 ou 8 fique longe de v2. 6 até que eles trabalham alguns bugs para fora com executá-lo como um serviço.
apt-get install mongodb-10gen=2.4.9
Evite que a versão da sua instalação MongoDB seja aumentada quando se actualizar.
echo "mongodb-10gen hold" | sudo dpkg --set-selections
Começa o serviço MongoDB.
sudo service mongodb start
Os seus ficheiros de base de dados por omissão para o /var/lib / mongo e os seus ficheiros de registo para / var/log / mongo.
Crie uma base de dados através da casca de mongo e introduza alguns dados falsos nela.mongo YOUR_DATABASE_NAME
db.createCollection(YOUR_COLLECTION_NAME)
for (var i = 1; i <= 25; i++) db.YOUR_COLLECTION_NAME.insert( { x : i } )
Agora paraconverter o MongoDB autônomo em um conjunto de réplicas {[[30]}.
Primeiro desliga o processo.mongo YOUR_DATABASE_NAME
use admin
db.shutdownServer()
Agora estamos a executar o MongoDB como um serviço, para não passarmos na opção "--replSet rs0" no argumento da linha de comando quando reiniciarmos o processo mongod. Em vez disso, pusemo-lo no mongod.ficheiro conf.
vi /etc/mongod.conf
Adicione estas linhas, para os seus caminhos de db e log.
replSet=rs0
dbpath=YOUR_PATH_TO_DATA/DB
logpath=YOUR_PATH_TO_LOG/MONGO.LOG
Agora abra a casca de 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 a busca elastica. Só estou a seguir esta ajuda.
Certifique-se que o Java está instalado.
sudo apt-get install openjdk-7-jre-headless -y
Fique com v1. 1.x por agora até que o bug plugin Mongo-River seja corrigido em 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
Certifica-te /etc/pesquisa elastica/pesquisa elastica.o yml tem as seguintes opções de configuração activadas se só estiver a desenvolver num nó único por agora:
cluster.name: "MY_CLUSTER_NAME"
node.local: true
Iniciar o serviço de pesquisa elastica.
sudo service elasticsearch start
Verifique se está a funcionar.
curl http://localhost:9200
Se vires algo assim, estás bem.
{
"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 Elasticsearch para que possa brincar 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
Estes dois plugins não são necessários, mas são bons para testar consultas e visualizar alterações nos seus índices.
bin/plugin --install mobz/elasticsearch-head
bin/plugin --install lukas-vlcek/bigdesk
Reiniciar Pesquisa Elastica.
sudo service elasticsearch restart
Finalmente índice a colecção 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 se o seu índice está na pesquisa elastica
curl -XGET http://localhost:9200/_aliases
Verifique a saúde do seu grupo.
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
Deve ser amarelo com cacos não classificados. Temos de dizer à Elasticsearch com o que queremos trabalhar.
curl -XPUT 'localhost:9200/_settings' -d '{ "index" : { "number_of_replicas" : 0 } }'
Verifique novamente a saúde dos aglomerados. Deve estar Verde agora.
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
Vai brincar.
Actualização: Elasticsearch-mongodb-river agora suporta ES v1. 4. 0 e mongodb v2. 6.x. no entanto, você ainda provavelmente vai ter problemas de desempenho em operações pesadas de inserção / atualização como este o 'plugin' irá tentar ler os oplogs do mongodb para sincronizar. Se houver um monte de operações desde que o bloqueio(ou fechamento em vez disso) desbloqueia, você vai notar uma utilização de memória extremamente alta em seu servidor elasticsearch. Se você planeja ter uma grande operação, river não é uma boa opção. Os desenvolvedores da ElasticSearch ainda recomendam que você gerencie seus próprios índices comunicando diretamente com sua API usando a biblioteca cliente para seu idioma, em vez de usar a river. Este não é o propósito do river. O Twitter-river é um grande exemplo de como o rio deve ser usado. É essencialmente uma ótima maneira de fonte de dados de fontes externas, mas não muito confiável para alto tráfego ou uso interno.
{[1] também considere que o rio mongodb fica para trás na versão, uma vez que não é mantido pela Organização ElasticSearch, é mantido por um terceiro partido. O desenvolvimento foi preso em v0.90 ramo por um longo tempo após o lançamento de v1.0, e quando uma versão para v1.0 foi lançado não era estável até elasticsearch lançou v1. 3. 0. Versões Mongodb também ficam para trás. Você pode encontrar - se em um local apertado quando você está olhando para se mover para uma versão posterior de cada um, especialmente com ElasticSearch sob um desenvolvimento tão pesado, com muitas características muito antecipadas no caminho. Manter-se a par da mais recente pesquisa elastica tem sido muito importante, uma vez que contamos fortemente em melhorar constantemente a nossa funcionalidade de pesquisa como parte fundamental do nosso produto. Em suma, é provável que consiga um produto melhor se o fizer. se. Não é assim tão difícil. É apenas um outro banco de dados para gerenciar em seu código, e ele pode facilmente ser deixado em seus modelos existentes sem grande refactoring.Elástico 2.Gestor de doc x: https://github.com/mongodb-labs/elastic2-doc-manager
O conector Mongo cria um gasoduto de um aglomerado MongoDB para um ou mais sistemas-alvo, como Solr, Elasticsearch ou outro aglomerado MongoDB. Ele sincroniza dados em MongoDB para o alvo, em seguida, segue o Oplog MongoDB, mantendo-se com as operações em MongoDB em tempo. Ele foi testado com python 2.6, 2.7 e 3.3+. A 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
- Instale o mongodb.
- Criar pastas de Dados:
$ mkdir RANDOM_PATH/node1 $ mkdir RANDOM_PATH/node2> $ mkdir RANDOM_PATH/node3
- iniciar instâncias Mongod
$ mongod --replSet test --port 27021 --dbpath node1 $ mongod --replSet test --port 27022 --dbpath node2 $ mongod --replSet test --port 27023 --dbpath node3
- Configure o conjunto de réplicas:
$ mongo config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]}; rs.initiate(config);
- Instalar A Pesquisa Elastica:
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.
- Instalar e configurar o Rio MongoDB:
$ bin / plugin --instalar suplemento.github.richardwilly98.elasticsearch / elasticsearch-river-mongodb
$ bin/plugin --install elasticsearch/elasticsearch-mapper-attachments
- Criar o "rio"e o índice:
Curl-XPUT 'http://localhost:8080/_river/mongodb/_meta' -d '{ "tipo":"mongodb", "mongodb": "db": "mydb", "colecção": "foo" }, "indice": { "nome", "tipo": "aleatório" } }'
-
Teste no navegador:
Desde que o conector mongo agora aparece morto, a minha empresa decidiu construir uma ferramenta para usar o Mongo mudar fluxos para a pesquisa elastica.
Os nossos resultados iniciais parecem promissores. Podes verificar 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.Se já tiver dados em MongoDB e quiser enviá-los muito facilmente para a busca elastica como "one-shot", pode tentar o meu pacote no nó.js https://github.com/itemsapi/elasticbulk.
Está a usar o nó.fluxos de js para que você possa importar dados de tudo o que está suportando fluxos (ou seja, MongoDB, PostgreSQL, MySQL, arquivos JSON, etc)Exemplo para MongoDB to Elasticsearch:
Instalar Pacotes:
npm install elasticbulk
npm install mongoose
npm install bluebird
Criar um script ou seja, um 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');
})
Envia os teus dados:
node script.js
Não é extremamente rápido, mas trabalha para milhões de discos (graças aos fluxos).