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

114

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

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

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

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

  • 3
    Примечание: реки устарели
Теги:
elasticsearch

7 ответов

266
Лучший ответ

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

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

Итак, как вы можете настроить один кластер node 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

Добавьте эти строки, подбирая для ваших путей к db и журналам.

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 включены следующие параметры конфигурации, если вы только разрабатываете на одном node:

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'

Поиграйте.

  • 2
    +1 добавлено в избранное Красиво сделано.
  • 0
    @ Duck5auce не имеет ни малейшего представления о том, как получить результат (эластичный результат поиска) с помощью express.js и отобразить в браузере, используя шаблон jade или ejs, например, например app.get ('search = "google"', function (req) , разрешение) {}); и спасибо за прекрасный ответ
Показать ещё 7 комментариев
32

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

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

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

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

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

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

  • 0
    Есть ли у вас ссылка или совет, где я могу индексировать, т.е. информацию об авторе в индекс публикации, так как публикация и автор находятся в 2 коллекциях и ссылки через referenceone и referencemany
  • 0
    Прочитайте это для некоторой предысторииastic.co/ guide/en/elasticsearch/guide/current/relations.html
Показать ещё 4 комментария
4

Я нашел mongo-коннектор полезным. Это форма Mongo Labs (MongoDB Inc.) и может использоваться теперь с Elasticsearch 2.x

Elastic 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

2

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

  • Установите mongodb.
  • Создание каталогов данных:
$ 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 --install com.github.richardwilly98.elasticsearch/elasticsearch-река-MongoDB

$bin/plugin --install elasticsearch/elasticsearch-mapper-attachments

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

curl -XPUT 'http://localhost:8080/_river/mongodb/_meta' -d '{        "type": "mongodb",        "mongodb": {            "db": "mydb",            "коллекция": "foo"       },        "индекс": {            "name": "name",            "type": "random"       }     } '

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

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

  • 6
    ElasticSearch устарел речные плагины. Это, безусловно, не лучший способ поддерживать поисковый индекс.
1

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

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

0

Здесь я нашел еще один хороший вариант для переноса ваших данных 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, указав путь к папке для вашей платформы. "monstache -v" к 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

Изображение 4664

Изображение 4665

Изображение 4666

Изображение 4667

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню