Как использовать Elasticsearch с MongoDB?

Я просмотрел много блогов и сайтов о настройке Elasticsearch для MongoDB для индексирования коллекций в MongoDB, но ни один из них не был простым.

пожалуйста, объясните мне шаг за шагом процесс установки elasticsearch, который должен включать в себя:

  • конфигурация
  • запустить в браузере

Я использую Node.js с express.js, поэтому, пожалуйста, помогите соответственно.

6 ответов


этого ответа должно быть достаточно, чтобы вы настроились следовать этому руководству по создание функционального компонента поиска с MongoDB, Elasticsearch и AngularJS.

если вы хотите использовать фасетный поиск с данными из API, то Matthiasn's РЕПО BirdWatch это то, что вы, возможно, захотите посмотреть.

Итак, вот как вы можете настроить один узел Elasticsearch "кластер" для индексирования MongoDB для использования в приложении NodeJS, Express на свежие платформе 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-Реки поддерживает без проблем.

импорт общедоступной GPG MongoDB Ключ.

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, держитесь подальше от v2.6 пока они не проработают некоторые ошибки с запуском его в качестве службы.

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 для теперь до Монго-Буга plugin будет исправлено в 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, или если вы используете mongoose, вы можете построить свои модели elasticsearch прямо в это или использовать mongoosastic что по сути делает это для вас.

еще одним недостатком MongoDB River является то, что вы застряли с помощью mongodb 2.4.ветвь x и ElasticSearch 0.90.X. Вы начнете искать что вы упускаете много действительно хороших функций, и проект MongoDB river просто не производит полезный продукт достаточно быстро, чтобы сохранить стабильность. Это сказало, что MongoDB River определенно не то, с чем я бы пошел в производство. Это создает больше проблем, чем стоит. Он будет случайным образом записывать под большой нагрузкой, он будет потреблять много памяти, и нет настройки, чтобы закрыть это. Кроме того, river не обновляется в реальном времени, он читает oplogs из mongodb, и это может задержать обновления для пока 5 минут в моем опыте.

недавно нам пришлось переписать большую часть нашего проекта, потому что его еженедельное Появление, что что-то идет не так с ElasticSearch. Мы даже зашли так далеко, что наняли консультанта Dev Ops, который также согласен, что лучше всего отойти от реки.

обновление: Elasticsearch-mongodb-river теперь поддерживает ES v1.4.0 и mongodb v2.6.х. Тем не менее, вы, вероятно, столкнетесь с проблемами производительности на тяжелых операции вставки / обновления, поскольку этот плагин попытается прочитать oplogs mongodb для синхронизации. Если есть много операций, так как блокировка (или защелка) разблокируется, вы заметите чрезвычайно высокое использование памяти на сервере elasticsearch. Если вы планируете провести большую операцию, река не является хорошим вариантом. Разработчики ElasticSearch по-прежнему рекомендуют вам управлять собственными индексами, напрямую взаимодействуя с их API, используя клиентскую библиотеку для вашего языка, а не используя river. Это не действительно назначение реки. Twitter-river-отличный пример того, как следует использовать реку. Это, по сути, отличный способ получения данных из внешних источников, но не очень надежный для высокого трафика или внутреннего использования.

также учтите, что mongodb-river отстает в версии, поскольку его не поддерживает организация ElasticSearch, ее поддерживает третья часть. Разработка застряла на v0.90 филиал в течение длительного времени после выпуска v1.0, и когда версия для v1.0 был выпущен не был стабильным, пока elasticsearch не выпустил v1.3.0. Версии Mongodb также отстают. Вы можете оказаться в трудном положении, когда вы хотите перейти к более поздней версии каждого, особенно с ElasticSearch при такой тяжелой разработке, со многими очень ожидаемыми функциями на пути. Оставаться в курсе последних ElasticSearch было очень важно, так как мы полагаемся на постоянное улучшение нашей функции поиска в качестве основной части нашего продукта.

в целом вы, вероятно, получите лучший продукт, если сделаете это сами. Это не так сложно. Его просто еще одна база данных для управления в вашем коде, и ее можно легко сбросить в существующие модели без серьезного рефакторинга.


Я нашел Mongo-разъем полезным. Это форма 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+. Подробная документация доступна на wiki.

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


вот как это сделать на mongodb 3.0. Я использовал этот хороший блог

  1. установить mongodb.
  2. создание каталогов данных:
$ mkdir RANDOM_PATH/node1
$ mkdir RANDOM_PATH/node2> 
$ mkdir RANDOM_PATH/node3
  1. запустить экземпляры Mongod
$ mongod --replSet test --port 27021 --dbpath node1
$ mongod --replSet test --port 27022 --dbpath node2
$ mongod --replSet test --port 27023 --dbpath node3
  1. настройка набора реплик:
$ mongo
config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]};    
rs.initiate(config);
  1. Установка 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. установка и настройка реке в MongoDB:

$ bin / plugin --установить com.на GitHub.richardwilly98.elasticsearch / elasticsearch-река-монгодб

$ bin / plugin --установить elasticsearch / elasticsearch-mapper-вложения

  1. создайте "реку" и индекс:

curl-XPUT 'http://localhost:8080/_river/mongodb/_meta ' - d '{ "тип": "mongodb", "в MongoDB": { "db": "mydb", "коллекция": "фу" }, "индекс": { "имя name", "тип": "случайный" } }'

  1. тест в браузере:

    http://localhost:9200/_search?q=главная


поскольку 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

Это не очень быстро, но это работает для миллионов записей (благодаря потокам).