Як користуватися Elasticsearch з MongoDB?


152

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

Будь ласка, поясніть мені покроковий процес встановлення elasesearch, який повинен включати:

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

Я використовую Node.js з express.js, тому, будь ласка, допоможіть відповідно.


4
Примітка: Річки застаріли
abdul qayyum

Відповіді:


287

Цього відповіді має бути достатньо для того, щоб ви налаштувались слідувати цьому навчальному посібнику щодо створення функціонального компонента пошуку за допомогою MongoDB, Elasticsearch та AngularJS .

Якщо ви хочете використовувати гранітний пошук з даними API, то ви можете подивитися на Matthiasn's BirdWatch Repo .

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

Отримайте пакет 10генів.

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 та log.

replSet=rs0
dbpath=YOUR_PATH_TO_DATA/DB
logpath=YOUR_PATH_TO_LOG/MONGO.LOG

Тепер знову відкрийте оболонку монго, щоб ініціалізувати набір реплік.

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 не виправиться в версії 1.2.

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 та відобразити у браузері за допомогою шаблону нефриту чи ejs, наприклад, наприклад app.get ('search = "google"', функція (req , res) {}); і дякую за чудову відповідь
bibin david

@bibindavid Я перевірив би цей ресурс. Це допоможе вам створити клієнтський модуль ES на стороні сервера, через який ви просунете відфільтровані запити через два інші спеціальні модулі. Надання даних все ще обробляється на клієнті, але це повинно бути гідною відправною точкою. sahan.me/posts/dabbling-in-elasticsearch-part-2-with-nodejs Github repo розташований тут: github.com/sahan/sahan.github.io/tree/master/resources/…
Дональд Гері

Ви можете у pls сказати мені, що буде краще монгоосастичного або використовуючи монгозний і еластичний модуль пошуку по-різному ????
Sudhanshu Gaur

7
Минув рік з часу відмінної відповіді duck5auce. Подумайте, зараз люди використовують 10gens [mongo-connector] [1] для синхронізації кластера MongoDB з ElasticSearch у режимі реального часу. Це хвости MonlogDB оплог. [1]: github.com/10gen-labs/mongo-connector/wiki/…
Ендрю Беттс

8
@ duck5auce Оновіть цю відповідь, вона застаріла. Річка застаріла
tsturzl

35

Використання річки може створювати проблеми, коли ваша операція збільшується. Рівер використовує тонну пам'яті, коли знаходиться під важкою експлуатацією. Я рекомендую реалізувати власні моделі еластичних досліджень, або якщо ви використовуєте мангусту, ви можете вбудовувати свої моделі еластичних досліджень прямо на це або використовувати монгоосастик, який по суті робить це для вас.

Ще один недолік річки Mongodb полягає в тому, що ви застрягнете за допомогою гілки mongodb 2.4.x та ElasticSearch 0.90.x. Ви почнете виявляти, що вам не вистачає багатьох справді приємних функцій, і проект mongodb river просто не дає досить швидко використовувати корисний продукт, щоб залишатися стабільним. Це сказало, що річка Mongodb - це точно не те, з чим я б пішов у виробництво. Це створює більше проблем, ніж варто. Він випадковим чином кине записувати під великим навантаженням, він буде споживати багато пам’яті, і немає налаштування обмежувати це. Крім того, річка не оновлюється в режимі реального часу, вона читає описи з mongodb, і це може затримати оновлення на довгі 5 хвилин.

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

ОНОВЛЕННЯ: Elasticsearch-mongodb-river тепер підтримує ES v1.4.0 та mongodb v2.6.x. Однак ви все ще зіткнетеся з проблемами продуктивності для важких операцій вставки / оновлення, оскільки цей плагін намагатиметься прочитати описи mongodb для синхронізації. Якщо операцій з моменту блокування (або швидше засувки) є багато операцій, ви помітите надзвичайно високе використання пам'яті на своєму еластичному сервері пошуку. Якщо ви плануєте велику операцію, річка - не хороший варіант. Розробники ElasticSearch все ще рекомендують вам керувати власними індексами, спілкуючись безпосередньо з їх API за допомогою клієнтської бібліотеки для вашої мови, а не використовуючи river. Це насправді не мета річки. Twitter-river - чудовий приклад того, як слід використовувати річку. Це, по суті, чудовий спосіб отримання даних із зовнішніх джерел,

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

Загалом ви, швидше за все, отримаєте кращий продукт, якщо зробите це самостійно. Це не так складно. Це просто ще одна база даних, якою можна керувати у вашому коді, і її можна легко перенести на існуючі моделі без капітального рефакторингу.


Чи є у вас посилання чи порада, де я можу індексувати, тобто інформацію про автора в індекс публікації, оскільки публікація та автор знаходяться у двох колекціях та посилаються через referenceone та referencemany
Marcel Djaman

Прочитайте це для деяких фонових еластичних.co
guide/

Це пояснювало б, як ви приєднуєтесь / співпрацюєте з
tsturzl

1
Elasticsearch - це БД зберігання документів, а не реляційна. Неможливо пов'язати дані в еластичному дослідженні, але денормалізація, швидше за все, відбудеться, але керувати ними можна за допомогою додаткової логіки (є плагіни). Найпоширеніший спосіб співвідносити дані як стан у посиланні вище - зберігати ідентифікаційну посилання у відносному документі. Переконайтеся, що ви зберігаєте цей ідентифікатор у встановленому полі not_analyzed, інакше у вас виникнуть проблеми із запитом до нього, зробіть так, як проаналізовані поля аналізуються.
tsturzl

4

Я вважав, монго-роз'єм корисний. Це форма лабораторії Mongo (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, ідучи за операціями в 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

Річка - це гарне рішення, коли ви хочете мати майже синхронізацію в реальному часі та загальне рішення.

Якщо у вас вже є дані в MongoDB, і ви хочете, щоб вони дуже просто переправили його в Elasticsearch, як "один постріл", ви можете спробувати мій пакет в 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:

$ bin / plugin --встановити com.github.richardwilly98.elasticsearch / elasticsearch-river-mongodb

$ bin / plugin - встановіть еластичний пошук / упругий пошук-вкладені пристрої

  1. Створіть “Річку” та Індекс:

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

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

    http: // localhost: 9200 / _search? q = дім


6
ElasticSearch застарілий плагін. Це, звичайно, не найкращий спосіб підтримувати пошуковий індекс.
tsturzl

3

Тут я знайшов ще один хороший варіант перемістити ваші дані MongoDB в Elasticsearch. Демон, що синхронізує mongodb з еластичним пошуком у режимі реального часу. Це монстр. Доступний за адресою: Монст

Нижче початкового налаштування для налаштування та використання його.

Крок 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 та введіть # 4.13.1 Монстрація використовує для своєї конфігурації формат 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

Додати запис у Монго

Монст Захопив подію та перемістив дані в еластичний пошук


3

Оскільки монго-роз'єм зараз виявляється мертвим, моя компанія вирішила створити інструмент для використання потоків змін Mongo для виведення в Elasticsearch.

Наші початкові результати виглядають багатообіцяючими. Перевірити це можна за посиланням https://github.com/electionsexperts/mongo-stream . Ми ще на початку розвитку, і будемо раді вітати пропозиції чи внески.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.