回答:
この答えは、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'
遊びに行きます。
リバーを使用すると、オペレーションがスケールアップするときに問題が発生する可能性があります。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つのデータベースであり、大幅なリファクタリングを行わなくても、既存のモデルに簡単にドロップできます。
not_analyzed
。そうでない場合は、分析されたフィールドがトークン化される方法でクエリを実行できません。
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
ほぼリアルタイムの同期と一般的なソリューションが必要な場合、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 3.0でこれを行う方法を次に示します。私はこの素敵なブログを使いました
$ 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 '{"type": "mongodb"、 "mongodb":{"db": "mydb"、 "collection": "foo" }、 "index":{"name": "name"、 "type": "random"}} '
ここで、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
mongo-connectorが停止しているように見えるので、私の会社はMongo変更ストリームを使用してElasticsearchに出力するためのツールを構築することにしました。
私たちの最初の結果は有望に見えます。https://github.com/electionsexperts/mongo-streamで確認できます。私たちはまだ開発の初期段階にあり、提案や貢献を歓迎します。