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

152

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

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

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

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

Бибин Дэвид
источник
4
Примечание: реки устарели
abdul qayyum

Ответы:

287

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

Если вы хотите использовать фасетный поиск с данными из API, то вам стоит взглянуть на BthWatch Repo от Matthiasn .

Итак, вот как можно настроить «кластер» 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. Выберите любую версию, с которой вам удобно. Я придерживаюсь v2.4.9, потому что это, кажется, самая последняя версия MongoDB-River поддерживает без проблем.

Импортируйте открытый ключ 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. Я просто следую за этим полезным Gist .

Убедитесь, что 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'

Иди играй.

Дональд Гари
источник
@ Duck5auce не имеет ни малейшего представления о том, как получить результат (эластичный результат поиска) с помощью express.js и отобразить в браузере, используя шаблон jade или ejs, например, app.get ('search = "google"', function (req) , Res) {}); и спасибо за чудесный ответ
Бибин Дэвид
@bibindavid Я бы проверил этот ресурс. Он проведет вас через создание клиентского модуля ES на стороне сервера, через который вы пропускаете отфильтрованные запросы через два других пользовательских модуля. Рендеринг данных по-прежнему обрабатывается на клиенте, но это должно стать хорошей отправной точкой. sahan.me/posts/dabbling-in-elasticsearch-part-2-with-nodejs Репозиторий Github находится здесь: github.com/sahan/sahan.github.io/tree/master/resources/…
Дональд Гари,
Можете ли вы сказать мне, что будет лучше mongoosastic или использовать модуль mongose ​​иasticsearch по-другому ????
Судханшу Гаур
7
Прошел год с тех пор, как отличный ответ duck5auce. Подумайте, что сейчас люди используют 10gens [mongo-connector] [1] для синхронизации кластера MongoDB с ElasticSearch в режиме реального времени. Это завершает оплог MongoDB. [1]: github.com/10gen-labs/mongo-connector/wiki/…
Эндрю Беттс,
8
@ duck5auce Пожалуйста, обновите этот ответ, он устарел. Река устарела
tsturzl
36

Использование реки может представлять проблемы, когда ваша деятельность расширяется. Река будет использовать тонну памяти, когда под тяжелой работой. Я рекомендую реализовать ваши собственные моделиasticsearch, или, если вы используете mongoose, вы можете встроить свои моделиasticsearch прямо в это или использовать mongoosastic, который, по сути, делает это для вас.

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

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

ОБНОВИТЬ: Elasticsearch-mongodb-river теперь поддерживает ES v1.4.0 и mongodb v2.6.x. Тем не менее, вы все равно, вероятно, столкнетесь с проблемами производительности при тяжелых операциях вставки / обновления, так как этот плагин будет пытаться читать оплоги mongodb для синхронизации. Если после разблокировки блокировки (или, скорее, защелки) много операций, вы заметите чрезвычайно высокое использование памяти на вашем сервереasticsearch. Если вы планируете провести большую операцию, река не является хорошим вариантом. Разработчики ElasticSearch по-прежнему рекомендуют вам управлять своими собственными индексами, напрямую связываясь с их API с использованием клиентской библиотеки для вашего языка, а не с помощью river. Это не совсем цель реки. Твиттер-река - отличный пример того, как использовать реку. По сути, это отличный способ получения данных из внешних источников,

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

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

tsturzl
источник
Есть ли у вас ссылка или совет, где я могу индексировать, т.е. информацию об авторе, в индекс публикации, поскольку публикация и автор находятся в 2 сборниках и ссылки с помощью referenceone и referencemany
Marcel Djaman
Прочитайте это для некоторой предысторииastic.co/ guide
elasticsearch/
Это объясняет, как вы объединяете / связываете данныеastic.co
tsturzl
1
Elasticsearch - это база данных для хранения документов, а не реляционная. Не исключено, что можно связать данные в эластичном поиске, но более вероятна денормализация, но можно управлять с помощью дополнительной логики (есть плагины). Наиболее распространенный способ связать данные, как состояние в ссылке выше, это сохранить ссылку на идентификатор в соответствующем документе. Убедитесь, что вы храните этот идентификатор в поле, для которого установлено значение not_analyzed, в противном случае у вас возникнут проблемы с его запросом, чтобы способ, которым анализируемые поля были токенизированы.
tsturzl
4

Я нашел полезный монго-разъем. Он создан в Mongo Labs (MongoDB Inc.) и теперь может использоваться с Elasticsearch 2.x

Менеджер документов Elastic 2.x: https://github.com/mongodb-labs/elastic2-doc-manager

mongo-connector создает конвейер от кластера MongoDB к одной или нескольким целевым системам, таким как Solr, Elasticsearch или другой кластер MongoDB. Он синхронизирует данные в MongoDB с целью, а затем подключает оплог MongoDB, следя за операциями в 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

Локендра Чаухан
источник
4

River - хорошее решение, если вы хотите иметь синхронизацию в реальном времени и общее решение.

Если у вас уже есть данные в MongoDB и вы хотите очень легко отправить их в Elasticsearch, например «one-shot», вы можете попробовать мой пакет в Node.js https://github.com/itemsapi/elasticbulk .

Он использует потоки Node.js, так что вы можете импортировать данные из всего, что поддерживает потоки (например, MongoDB, PostgreSQL, MySQL, JSON-файлы и т. Д.)

Пример для MongoDB для Elasticsearch:

Установить пакеты:

npm install elasticbulk
npm install mongoose
npm install bluebird

Создайте скрипт, т.е. 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');
})

Отправьте ваши данные:

node script.js

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


источник
3

Вот как это сделать на 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 River:

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

$ bin / plugin --installesesearch /asticsearch-mapper-attachments

  1. Создайте «Ривер» и Индекс:

curl -XPUT ' http: // localhost: 8080 / _river / mongodb / _meta ' -d '{"type": "mongodb", "mongodb": {"db": "mydb", "collection": "foo" }, "index": {"name": "name", "type": "random"}} '

  1. Тест на браузере:

    HTTP: // локальный: 9200 / _search д = дом

Прияншу Чаухан
источник
6
ElasticSearch устарел речные плагины. Это, безусловно, не лучший способ поддерживать поисковый индекс.
tsturzl
3

Здесь я нашел еще один хороший вариант для переноса ваших данных MongoDB в Elasticsearch. Демон go, который синхронизирует mongodb сasticsearch в реальном времени. Это чудовище. Его можно найти по адресу: Monstache

Ниже начальной настройки для настройки и использования.

Шаг 1:

C:\Program Files\MongoDB\Server\4.0\bin>mongod --smallfiles --oplogSize 50 --replSet test

Шаг 2 :

C:\Program Files\MongoDB\Server\4.0\bin>mongo

C:\Program Files\MongoDB\Server\4.0\bin>mongo
MongoDB shell version v4.0.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.2
Server has startup warnings:
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
MongoDB Enterprise test:PRIMARY>

Шаг 3: Проверьте репликацию.

MongoDB Enterprise test:PRIMARY> rs.status();
{
        "set" : "test",
        "date" : ISODate("2019-01-18T11:39:00.380Z"),
        "myState" : 1,
        "term" : NumberLong(2),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1547811537, 1),
                        "t" : NumberLong(2)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1547811537, 1),
                        "t" : NumberLong(2)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1547811537, 1),
                        "t" : NumberLong(2)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1547811537, 1),
                        "t" : NumberLong(2)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1547811517, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "localhost:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 736,
                        "optime" : {
                                "ts" : Timestamp(1547811537, 1),
                                "t" : NumberLong(2)
                        },
                        "optimeDate" : ISODate("2019-01-18T11:38:57Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1547810805, 1),
                        "electionDate" : ISODate("2019-01-18T11:26:45Z"),
                        "configVersion" : 1,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1547811537, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1547811537, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
MongoDB Enterprise test:PRIMARY>

Шаг 4. Загрузите « https://github.com/rwynn/monstache/releases ». Разархивируйте загрузку и настройте переменную PATH, указав путь к папке для вашей платформы. Перейти к CMD и введите"monstache -v" Перейдите # 4.13.1 Monstache использует формат TOML для своей конфигурации. Настройте файл для миграции с именем config.toml

Шаг 5

Мой config.toml ->

mongo-url = "mongodb://127.0.0.1:27017/?replicaSet=test"
elasticsearch-urls = ["http://localhost:9200"]

direct-read-namespaces = [ "admin.users" ]

gzip = true
stats = true
index-stats = true

elasticsearch-max-conns = 4
elasticsearch-max-seconds = 5
elasticsearch-max-bytes = 8000000 

dropped-collections = false
dropped-databases = false

resume = true
resume-write-unsafe = true
resume-name = "default"
index-files = false
file-highlighting = false
verbose = true
exit-after-direct-reads = false

index-as-update=true
index-oplog-time=true

Шаг 6

D:\15-1-19>monstache -f config.toml

Монстр Бег ...

Подтвердите перенесенные данные в Elasticsearch

Добавить запись в Монго

Monstache Захватил событие и перенес данные в эластичный поиск

Абхиджит Башетти
источник
3

Поскольку mongo-connector теперь кажется мертвым, моя компания решила создать инструмент для использования потоков изменений Mongo для вывода в Elasticsearch.

Наши первые результаты выглядят многообещающими. Вы можете проверить это в https://github.com/electionsexperts/mongo-stream . Мы все еще находимся на ранней стадии разработки и будем рады предложениям или предложениям.

Джад
источник