私はMongoDBでElasticsearch for MongoDBを設定してMongoDB内のコレクションにインデックスを付けることについて多くのブログやサイトを見てきましたが、どれも簡単なことではありませんでした。
Elasticsearchをインストールするためのステップバイステップのプロセスを説明してください。
Node.jsとexpress.jsを使用していますので、それに応じて助けてください。
この回答は、 MongoDB、Elasticsearch、およびAngularJSを使用した機能的検索コンポーネントの構築 でこのチュートリアルに従うようにセットアップするのに十分なはずです。
APIからのデータでファセット検索を使用したい場合は、Matthiasnの BirdWatch Repo をご覧ください。
だからここにあなたがNode2S、新鮮なEC2 Ubuntu 14.04インスタンスのExpressアプリで使用するためにMongoDBをインデックスするためにシングルノードElasticsearch "cluster"を設定する方法があります。
すべてが最新であることを確認してください。
Sudo apt-get update
NodeJSをインストールします。
Sudo apt-get install nodejs
Sudo apt-get install npm
Install MongoDB - これらのステップはMongoDBのドキュメントから直接のものです。快適なバージョンを選択してください。最新のバージョンであると思われるため、v2.4.9を使用しています。 MongoDB-River 問題なくサポートしています。
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
最新版が欲しくない場合は、あなたのバージョンを選択してください。あなたがあなたの環境を窓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 Shellを介してデータベースを作成し、そこにダミーデータをプッシュします。
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とlogのパスを控えてください。
replSet=rs0
dbpath=YOUR_PATH_TO_DATA/DB
logpath=YOUR_PATH_TO_LOG/MONGO.LOG
もう一度mongo Shellを開いてレプリカセットを初期化します。
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
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"
}
それがMongoDBと遊ぶことができるように今Elasticsearchプラグインをインストールしてください。
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'
遊びに行きます。
あなたの操作が拡大するとき、川を使うことは問題を提示することができます。 Riverは重い操作の下でメモリのトンを使います。独自のelasticsearchモデルを実装することをお勧めします。あるいは、mongooseを使用している場合は、その中にelasticsearchモデルを構築するか、 mongoosastic を使用して基本的にこれを実行できます。
Mongodb Riverのもう1つの欠点は、mongodb 2.4.xブランチとElasticSearch 0.90.xを使用して動かなくなることです。本当に素晴らしい機能の多くを見逃していることに気づき始めるでしょう。そしてmongodb川プロジェクトは安定した状態を保つのに十分な速さで使用可能な製品を生成しないだけです。それは、Mongodb川は間違いなく私が生産に入るものではないということです。それはその価値以上の問題を提起しました。負荷が大きいとランダムにwriteを落とし、大量のメモリを消費します。それを制限する設定はありません。さらに、riverはリアルタイムで更新されず、mongodbからoplogを読み取ります。これにより、私の経験では5分ほど更新が遅れる可能性があります。
私たちは最近プロジェクトの大部分を書き直さなければなりませんでした、なぜなら毎週の出来事がElasticSearchで何か問題が起きるからです。私たちはDev Opsコンサルタントを雇うことさえしていました、そしてそれも川から離れることが最善であることに同意します。
更新:Elasticsearch-mongodb-riverはES v1.4.0とmongodb v2.6.xをサポートするようになりました。ただし、このプラグインはmongodbのoplogを読み取って同期しようとするため、多大な挿入/更新操作でパフォーマンスの問題が発生する可能性があります。ロック(またはむしろラッチ)が解除されてからたくさんの操作があると、あなたのelasticsearchサーバーのメモリ使用量が非常に多くなることに気付くでしょう。大規模な事業を計画している場合、川は良い選択肢ではありません。 ElasticSearchの開発者はまだあなたの言語のためのクライアントライブラリを使用するよりもむしろ彼らのAPIと直接通信することによってあなた自身のインデックスを管理することを推奨します。これは本当に川の目的ではありません。 Twitter-riverはriverの使い方の良い例です。それは本質的に外部の情報源からデータを取得するための素晴らしい方法ですが、トラフィックが多い場合や内部で使用する場合はあまり信頼できません。
それはElasticSearch Organizationによって維持されておらず、第三者によって維持されているので、mongodb-riverはバージョンが遅れていることも考慮してください。開発はv1.0のリリース後も長い間v0.90ブランチで止まっていました、そしてv1.0のバージョンがリリースされたときそれはelasticsearchがv1.3.0をリリースするまで安定していませんでした。 Mongodbのバージョンも遅れています。特に、ElasticSearchがそのような重い開発の下で、多くの期待される機能が追加されていく中で、それぞれの新しいバージョンに移行しようとしているときには、きつい立場にいるかもしれません。最新のElasticSearchを常に最新の状態に保つことは非常に重要です。検索機能を絶えず向上させることに頼っているからです。
あなたがそれを自分でやれば、全体として、より良い製品を手に入れることができるでしょう。それほど難しくありません。それはあなたのコードで管理するためのもう一つのデータベースです、そしてそれは大きなリファクタリングなしであなたの既存のモデルに簡単にドロップできます。
私は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+でテストされています。詳細な文書はウィキにあります。
https://github.com/mongodb-labs/mongo-connectorhttps://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch
Mongodb 3.0でこれを行う方法はこちらです。私はこれを使いました blog
$ mkdir RANDOM_PATH/node1 $ mkdir RANDOM_PATH/node2> $ mkdir RANDOM_PATH/node3
$ mongod --replSet test --port 27021 --dbpath node1 $ mongod --replSet test --port 27022 --dbpath node2 $ mongod --replSet test --port 27023 --dbpath node3
$ mongo config = {_id: 'test', members: [ {_id: 0, Host: 'localhost:27021'}, {_id: 1, Host: 'localhost:27022'}]}; rs.initiate(config);
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.
$ bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb
$ bin/plugin - elasticsearch/elasticsearch-mapper-attachmentsをインストールする
curl -XPUT ' http:// localhost:8080/_river/mongodb/_meta ' - d '{"タイプ": "mongodb"、 "mongodb":{"db": "mydb"、 "コレクション": "foo"}、 "インデックス":{"名前": "名前"、 "タイプ": "ランダム"}} '
ブラウザでテストします。
Mongo-connectorは現在死んでいるように見えるので、私の会社はMongoのチェンジストリームを使ってElasticsearchに出力するためのツールを作ることにしました。
私たちの最初の結果は有望に見えます。あなたはそれをチェックアウトすることができます https://github.com/everyone-counts/mongo-stream 。我々はまだ開発の初期段階にあり、そして提案や貢献を歓迎するでしょう。
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
それほど速くはありませんが、何百万ものレコードに対応しています(ストリームのおかげで)。
ここで私はあなたのMongoDBデータをElasticsearchに移行するための別の良い選択肢を見つけました。リアルタイムでmongodbをelasticsearchに同期させるgoデーモン。そのモンスタッチ。その入手可能な場所: 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