MongoDBでElasticsearchを使用する方法


152

MongoDBのコレクションにインデックスを付けるようにMongoDBのElasticsearchを構成する方法について、多くのブログやサイトを調べてきましたが、どれも簡単ではありませんでした。

elasticsearchをインストールするための段階的なプロセスを私に説明してください。

  • 構成
  • ブラウザで実行

Node.jsとexpress.jsを使用しているので、それに応じて支援してください。


4
注:河川は廃止されました
abdul qayyum

回答:


287

この答えは、MongoDB、Elasticsearch、およびAngularJSを使用した機能的な検索コンポーネントの構築に関するこのチュートリアルを実行するために設定するには十分です。

APIからのデータでファセット検索を使用する場合は、MatthiasnのBirdWatch Repo役立ちます。

したがって、ここでは、新しいEC2 Ubuntu 14.04インスタンスのNodeJS、Expressアプリで使用するためにMongoDBにインデックスを付けるように単一ノードElasticsearch "クラスター"を設定する方法を示します。

すべてが最新であることを確認してください。

sudo apt-get update

NodeJSをインストールします。

sudo apt-get install nodejs
sudo apt-get install npm

MongoDBのインストール -これらの手順は、MongoDBのドキュメントから直接です。使いやすいバージョンを選択してください。MongoDB-Riverの最新バージョンのようですので、v2.4.9を使用しています。が問題なくサポートするを使用しています。

MongoDB公開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マシンで環境を設定している場合は、サービスとして実行することでいくつかのバグが解決されるまで、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をサービスとして実行しているため、mongodプロセスを再起動するときに、コマンドライン引数の「--replSet rs0」オプションを渡しません。代わりに、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

Mongo-Riverプラグインのバグがv1.2.1で修正されるまで、今のところv1.1.xを使用してください。

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

これらの2つのプラグインは必須ではありませんが、クエリのテストやインデックスへの変更の視覚化に適しています。

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){}); そして素晴らしい答えをありがとう
bibin david

@bibindavidこのリソースをチェックアウトします。他の2つのカスタムモジュールを介してフィルターされたクエリをプッシュするサーバー側ESクライアントモジュールの作成について説明します。データのレンダリングは引き続きクライアントで処理されますが、それはまともな開始点でなければなりません。 sahan.me/posts/dabbling-in-elasticsearch-part-2-with-nodejs Githubリポジトリは次の場所にあります: github.com/sahan/sahan.github.io/tree/master/resources/…–
Donald Gary

u plsは、mongoosasticのほうが良いか、mongoseとelasticsearchモジュールを別々に使用する方がいいか教えてくれますか????
Sudhanshu Gaur

7
duck5auceの素晴らしい回答から1年になります。人々が10gens [mongo-connector] [1]を使用してMongoDBクラスターをElasticSearchとリアルタイムで同期していると考えてください。これは、MongoDB oplogをテールします。[1]: github.com/10gen-labs/mongo-connector/wiki/...
アンドリュー・ベッツ

8
@ duck5auceこの回答を更新してください。古くなっています。Riverは廃止されました
tsturzl

35

リバーを使用すると、オペレーションがスケールアップするときに問題が発生する可能性があります。Riverは、操作が重い場合、大量のメモリを使用します。独自のelasticsearchモデルを実装することをお勧めします。または、mongooseを使用している場合は、elasticsearchモデルをその中に構築するか、基本的にこれを行うmongoosasticを使用できます。

Mongodb Riverのもう1つの欠点は、mongodb 2.4.xブランチとElasticSearch 0.90.xを使用するとスタックすることです。本当に素晴らしい機能の多くを見逃していることに気づくでしょう。mongodbRiverプロジェクトでは、安定性を維持するのに十分な速さで使用可能な製品が生成されません。そうは言っても、Mongodb Riverは私が実際に運用するようなものではありません。それはその価値よりも多くの問題を提起しました。負荷が高いと書き込みがランダムにドロップされ、大量のメモリが消費されます。これを制限する設定はありません。さらに、リバーはリアルタイムで更新されず、mongodbからoplogを読み取ります。これにより、私の経験では更新が5分間遅延する可能性があります。

ElasticSearchで毎週問題が発生するため、プロジェクトの大部分を書き直す必要がありました。私たちは、Dev Opsのコンサルタントを雇うことさえ行っていました。DevOpsコンサルタントも、リバーから離れるのが最善であることに同意しています。

更新: Elasticsearch-mongodb-riverがES v1.4.0およびmongodb v2.6.xをサポートするようになりました。ただし、このプラグインはmongodbのoplogを読み取って同期しようとするため、挿入/更新操作の負荷が高いときにパフォーマンスの問題が発生する可能性があります。ロック(またはラッチ)のロックが解除されてから多くの操作が行われると、elasticsearchサーバーのメモリ使用量が非常に高くなります。大規模な事業を計画している場合、川は良い選択肢ではありません。ElasticSearchの開発者は、リバーを使用するのではなく、言語のクライアントライブラリを使用してAPIと直接通信することにより、独自のインデックスを管理することをお勧めします。これは川の目的ではありません。Twitter-riverは、riverの使用例です。基本的に、外部ソースからデータを調達するのに最適な方法です。

また、Mongodb-riverは、ElasticSearch Organizationによって保守されておらず、サードパーティによって保守されているため、バージョンが遅れていることも考慮してください。v1.0のリリース後、開発は長い間v0.90ブランチでスタックし、v1.0のバージョンがリリースされたとき、elasticsearchがv1.3.0をリリースするまで安定していません。Mongodbバージョンも遅れをとっています。特に、ElasticSearchが非常に開発が進んでおり、非常に多くの予想される機能が進行中の場合、それぞれの新しいバージョンに移行しようとすると、窮地に陥ることがあります。製品のコア部分として検索機能を常に改善することに大きく依存しているため、最新のElasticSearchを継続することは非常に重要です。

結局のところ、自分でやれば、より良い製品を手に入れることができるでしょう。それほど難しいことではありません。コードで管理するもう1つのデータベースであり、大幅なリファクタリングを行わなくても、既存のモデルに簡単にドロップできます。


出版物と著者が2つのコレクションにあり、referenceoneとreferencemanyを介してリンクしているため、リンクまたはアドバイス(つまり、著者情報を出版物インデックスにインデックス化できる場所)
Marcel Djaman

いくつかの背景については、こちらをお読みくださいelastic.co/guide/en/elasticsearch/guide/current/relations.html
tsturzl

これは、データ関連/あなたが参加する方法を説明するだろうelastic.co/guide/en/elasticsearch/guide/current/...を
tsturzl

1
Elasticsearchは、リレーショナルデータベースではなく、ドキュメントストレージDBです。elasticsearchでデータを関連付けることは不可能ではありませんが、非正規化が発生する可能性が高くなりますが、追加のロジックで管理できます(プラグインがあります)。上記のリンクの状態のように、データを関連付ける最も一般的な方法は、相対ドキュメントにID参照を格納することです。に設定されているフィールドにこのIDを保存してくださいnot_analyzed。そうでない場合は、分析されたフィールドがトークン化される方法でクエリを実行できません。
tsturzl 2015年

4

mongo-connectorが役に立った。これはMongo Labs(MongoDB Inc.)の形式であり、Elasticsearch 2.xで現在使用できます。

Elastic 2.xドキュメントマネージャー:https : //github.com/mongodb-labs/elastic2-doc-manager

mongo-connectorは、MongoDBクラスターから、Solr、Elasticsearch、または別のMongoDBクラスターなどの1つ以上のターゲットシステムへのパイプラインを作成します。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


4

ほぼリアルタイムの同期と一般的なソリューションが必要な場合、Riverは優れたソリューションです。

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 Riverのインストールと構成:

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

$ bin / plugin --elasticsearch / elasticsearch-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:// localhost:9200 / _search?q = home


6
ElasticSearchはRiverプラグインを非推奨にしました。これは、検索インデックスを維持するための最良の方法ではありません。
tsturzl 2015

3

ここで、MongoDBデータをElasticsearchに移行する別の良いオプションを見つけました。mongodbをelasticsearchにリアルタイムで同期するgoデーモン。そのモンスタッシュ。そので利用可能: Monstache

設定して使用するための初期setpの下。

ステップ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" 。#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

Monstache実行中...

Elasticsearchで移行されたデータを確認する

Mongoでレコードを追加する

Monstacheはイベントをキャプチャし、データをelasticsearchに移行しました


3

mongo-connectorが停止しているように見えるので、私の会社はMongo変更ストリームを使用してElasticsearchに出力するためのツールを構築することにしました。

私たちの最初の結果は有望に見えます。https://github.com/electionsexperts/mongo-streamで確認できます。私たちはまだ開発の初期段階にあり、提案や貢献を歓迎します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.