web-dev-qa-db-ja.com

MongoDBでElasticsearchを使用する方法

私はMongoDBでElasticsearch for MongoDBを設定してMongoDB内のコレクションにインデックスを付けることについて多くのブログやサイトを見てきましたが、どれも簡単なことではありませんでした。

Elasticsearchをインストールするためのステップバイステップのプロセスを説明してください。

  • 構成
  • ブラウザで実行する

Node.jsとexpress.jsを使用していますので、それに応じて助けてください。

124
bibin david

この回答は、 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'

遊びに行きます。

264
Donald Gary

あなたの操作が拡大するとき、川を使うことは問題を提示することができます。 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を常に最新の状態に保つことは非常に重要です。検索機能を絶えず向上させることに頼っているからです。

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

33
tsturzl

私は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

4

Mongodb 3.0でこれを行う方法はこちらです。私はこれを使いました blog

  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 '{"タイプ": "mongodb"、 "mongodb":{"db": "mydb"、 "コレクション": "foo"}、 "インデックス":{"名前": "名前"、 "タイプ": "ランダム"}} '

  1. ブラウザでテストします。

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

2

Mongo-connectorは現在死んでいるように見えるので、私の会社はMongoのチェンジストリームを使ってElasticsearchに出力するためのツールを作ることにしました。

私たちの最初の結果は有望に見えます。あなたはそれをチェックアウトすることができます https://github.com/everyone-counts/mongo-stream 。我々はまだ開発の初期段階にあり、そして提案や貢献を歓迎するでしょう。

1
Jud

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

それほど速くはありませんが、何百万ものレコードに対応しています(ストリームのおかげで)。

1
Mateusz Rzepa

ここで私はあなたの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

Monstache Running...

Confirm Migrated Data at Elasticsearch

Add Record at Mongo

Monstache Captured the event and migrate the data to elasticsearch

0