Как использовать Elasticsearch с MongoDB?
Я просмотрел много блогов и сайтов о настройке Elasticsearch для MongoDB для индексирования коллекций в MongoDB, но ни один из них не был простым.
пожалуйста, объясните мне пошаговый процесс установки elasticsearch, который должен включать:
- конфигурация
- запуск в браузере
Я использую узел.js с экспресс.js, поэтому, пожалуйста, помогите соответственно.
6 ответов:
этого ответа должно быть достаточно, чтобы вы настроились следовать этому руководству по создание функционального компонента поиска с MongoDB, Elasticsearch и AngularJS.
если вы хотите использовать фасетный поиск с данными из API, то Matthiasn's Понаблюдать За Птицами РЕПО это то, что вы, возможно, захотите посмотреть.
Итак, вот как вы можете настроить один узел Elasticsearch "cluster" для индексирования MongoDB для использования в NodeJS, Express app на a свежий экземпляр EC2 Ubuntu 14.04.
убедитесь, что все в актуальном состоянии.
sudo apt-get update
Установить NodeJS.
sudo apt-get install nodejs sudo apt-get install npm
Установить MongoDB - эти шаги прямо из MongoDB docs. Выберите любую версию, с которой вам удобно. Я придерживаюсь v2.4. 9, потому что это, кажется, самая последняя версия В MongoDB-Реки поддерживает без проблем.
импорт MongoDB public GPG Ключ.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
обновить список источников.
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
получить пакет 10gen.
sudo apt-get install mongodb-10gen
затем выберите свою версию, если вы не хотите самую последнюю. Если вы настраиваете свою среду на машине с windows 7 или 8, держитесь подальше от версии 2.0, пока они не устранят некоторые ошибки при запуске ее как службы.
apt-get install mongodb-10gen=2.4.9
предотвратите версию вашей установки MongoDB при обновлении.
echo "mongodb-10gen hold" | sudo dpkg --set-selections
начать Сервис MongoDB.
sudo service mongodb start
файлы базы данных по умолчанию в /var / lib /mongo и файлы журнала в/var/log / mongo.
создайте базу данных через оболочку mongo и вставьте в нее некоторые фиктивные данные.
mongo YOUR_DATABASE_NAME db.createCollection(YOUR_COLLECTION_NAME) for (var i = 1; i <= 25; i++) db.YOUR_COLLECTION_NAME.insert( { x : i } )
теперь преобразуйте автономный MongoDB в набор реплик.
сначала завершите процесс.
mongo YOUR_DATABASE_NAME use admin db.shutdownServer()
теперь мы запускаем MongoDB как сервис, поэтому мы не передаем опцию "--replSet rs0 " в аргумент командной строки при перезапуске процесса mongod. Вместо этого мы поместили его в mongod.файл conf.
vi /etc/mongod.conf
добавьте эти строки, вложенные для ваших путей к БД и журналу.
replSet=rs0 dbpath=YOUR_PATH_TO_DATA/DB logpath=YOUR_PATH_TO_LOG/MONGO.LOG
теперь снова откройте оболочку mongo, чтобы инициализировать набор реплик.
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.
теперь установите Elasticsearch. Я просто следую этому полезно суть.
убедитесь, что установлена Java.
sudo apt-get install openjdk-7-jre-headless -y
придерживайтесь v1.1.x для теперь, пока ошибка плагина Mongo-River не будет исправлена в 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
убедитесь, что /etc/elasticsearch / elasticsearch.yml имеет следующие параметры конфигурации включены, если вы разрабатываете только на одном узле на данный момент:
cluster.name: "MY_CLUSTER_NAME" node.local: true
запустите службу Elasticsearch.
sudo service elasticsearch start
убедитесь, что он работает.
curl http://localhost:9200
если вы видите что-то вроде этого, то вы хорошо.
{ "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" }
теперь установите Плагины Elasticsearch, чтобы он может играть с MongoDB.
bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/1.6.0 bin/plugin --install elasticsearch/elasticsearch-mapper-attachments/1.6.0
эти два плагина не нужны, но они хороши для тестирования запросов и визуализации изменений в ваших индексах.
bin/plugin --install mobz/elasticsearch-head bin/plugin --install lukas-vlcek/bigdesk
Перезапустить Elasticsearch.
sudo service elasticsearch restart
наконец индексировать коллекцию из 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" } }'
проверьте, что ваш индекс находится в Elasticsearch
curl -XGET http://localhost:9200/_aliases
проверьте работоспособность кластера.
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
он, вероятно, желтый с некоторыми неназначенными осколками. Мы должны сказать Elasticsearch, с чем мы хотим работать.
curl -XPUT 'localhost:9200/_settings' -d '{ "index" : { "number_of_replicas" : 0 } }'
проверьте работоспособность кластера еще раз. Теперь он должен быть зеленым.
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
идем играть.
использование реки может представлять проблемы, когда ваша операция масштабируется. Река будет использовать тонну памяти при тяжелой работе. Я рекомендую реализовать свои собственные модели elasticsearch, или если вы используете Мангуст, вы можете построить свои модели elasticsearch прямо в это или использовать mongoosastic который по существу делает это для вас.
еще одним недостатком реки Mongodb является то, что вы застряли с помощью mongodb 2.4.X ветвь, и ElasticSearch 0.90.х. Вы начинаете находить что вы упускаете много действительно хороших функций, и проект mongodb river просто не производит полезный продукт достаточно быстро, чтобы поддерживать стабильность. Тем не менее, MongoDB River определенно не то, с чем я бы пошел в производство. Это создает больше проблем, чем стоит. Он будет случайным образом сбрасывать запись под большой нагрузкой, он будет потреблять много памяти, и нет никаких настроек для этого. Кроме того, river не обновляется в реальном времени, он читает оплоги из mongodb, и это может задержать обновления для до тех пор, как 5 минут в моем опыте.
недавно нам пришлось переписать большую часть нашего проекта, потому что его еженедельное Появление, что что-то идет не так с ElasticSearch. Мы даже зашли так далеко, чтобы нанять консультанта Dev Ops, который также согласен с тем, что лучше всего отойти от реки.
обновление: Elasticsearch-mongodb-river теперь поддерживает ES v1.4.0 и mongodb v2.6.х. Тем не менее, вы, вероятно, столкнетесь с проблемами производительности на тяжелых операции вставки / обновления, поскольку этот плагин попытается прочитать оплоги mongodb для синхронизации. Если есть много операций, так как блокировка (или защелка скорее) разблокируется,вы заметите чрезвычайно высокое использование памяти на вашем сервере elasticsearch. Если вы планируете провести большую операцию, река не является хорошим вариантом. Разработчики ElasticSearch по-прежнему рекомендуют вам управлять своими собственными индексами, напрямую взаимодействуя с их API, используя клиентскую библиотеку для вашего языка, а не используя river. Это не действительно цель реки. Twitter-river является отличным примером того, как река должна использоваться. Это, по сути, отличный способ получения данных из внешних источников, но не очень надежный для высокого трафика или внутреннего использования.
также учтите, что mongodb-river отстает в версии, так как его не поддерживает организация ElasticSearch, ее поддерживает третья сторона. Разработка застряла на ветке v0. 90 в течение длительного времени после выпуска v1.0, и когда была выпущена версия для v1. 0 не было стабильным, пока elasticsearch не выпустила v1.3.0. Версии Mongodb также отстают. Вы можете оказаться в трудном положении, когда вы хотите перейти к более поздней версии каждого, особенно с ElasticSearch при такой тяжелой разработке, со многими очень ожидаемыми функциями на этом пути. Оставаться на последнем ElasticSearch было очень важно, поскольку мы в значительной степени полагаемся на постоянное улучшение нашей функции поиска в качестве основной части нашего продукта.
в целом вы, вероятно, получите лучший продукт, если вы сделаете это сами. Это не так уж и сложно. Это просто еще одна база данных для управления в вашем коде, и ее можно легко вставить в существующие модели без серьезного рефакторинга.
Я нашел монго-коннектор полезным. Это форма Mongo Labs (MongoDB Inc.) и может использоваться теперь с Elasticsearch 2.x
эластичный 2.X doc manager:https://github.com/mongodb-labs/elastic2-doc-manager
mongo-connector создает конвейер из кластера MongoDB в одну или несколько целевых систем, таких как Solr, Elasticsearch или другой кластер MongoDB. Он синхронизирует данные в MongoDB с целью, а затем следит за MongoDB oplog, не отставая от операций в MongoDB в режиме реального времени. Он был протестирован с помощью Python 2.6, 2.7 и 3.3+. Подробная документация доступна на вики.
https://github.com/mongodb-labs/mongo-connector https://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch
вот как это сделать на mongodb 3.0. Я использовал это приятно блог
- установить mongodb.
- создать каталоги данных:
$ mkdir RANDOM_PATH/node1 $ mkdir RANDOM_PATH/node2> $ mkdir RANDOM_PATH/node3
- запуск экземпляров Mongod
$ mongod --replSet test --port 27021 --dbpath node1 $ mongod --replSet test --port 27022 --dbpath node2 $ mongod --replSet test --port 27023 --dbpath node3
- настройка набора реплик:
$ mongo config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]}; rs.initiate(config);
- Установка 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.
- установка и настройка реке в MongoDB:
$ bin / plugin --установить com.на GitHub.richardwilly98.elasticsearch / elasticsearch-river-mongodb
$ bin / plugin --install elasticsearch/elasticsearch-mapper-attachments
- создайте "реку" и индекс:
curl-XPUT - http://localhost:8080/_river/mongodb/_meta' - d '{ "тип": "mongodb", "в MongoDB": { "db": "mydb", "коллекция": "фу" }, "индекс": { "имя name", "type": "random" } }'
тест в браузере:
поскольку mongo-connector теперь кажется мертвым, моя компания решила создать инструмент для использования потоков изменений Mongo для вывода в Elasticsearch.
наши первоначальные результаты выглядят многообещающими. Вы можете проверить это на https://github.com/everyone-counts/mongo-stream. Мы все еще находимся на ранней стадии разработки и будем приветствовать предложения или вклады.
река является хорошим решением, как только вы хотите иметь почти в режиме реального времени синхронизации и общего решения.
Если у вас уже есть данные в MongoDB и вы хотите очень легко отправить их в Elasticsearch, например "one-shot", вы можете попробовать мой пакет в узле.js https://github.com/itemsapi/elasticbulk.
он использует узел.JS потоки, так что вы можете импортировать данные из всего, что поддерживает потоки (т. е. MongoDB, PostgreSQL, MySQL, JSON файлы, и т. д.)
пример для MongoDB в Elasticsearch:
установить пакеты:
npm install elasticbulk npm install mongoose npm install bluebird
создать скрипт т. е. скрипт.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'); })
отправляем ваши данные:
node script.js
Это не очень быстро, но это работает для миллионов записей (благодаря потокам).