如何在MongoDB中使用Elasticsearch?
我已经浏览了许多关于configurationElasticsearch for MongoDB的博客和网站,以便在MongoDB中对集合进行索引,但没有一个是直接的。
请向我解释安装elasticsearch的一步一步的过程,其中应包括:
- 组态
- 在浏览器中运行
我正在使用express.js Node.js,所以请相应的帮助。
这个答案应该足以让你设置遵循本教程关于使用MongoDB,Elasticsearch和AngularJS构buildfunctionsearch组件 。
如果您正在寻找使用API的数据进行分面search,那么Matthiasn的BirdWatch Repo就是您可能想要看的东西。
因此,您可以如何设置单个节点Elasticsearch“集群”来为新的EC2 Ubuntu 14.04实例上的NodeJS,Express应用程序使用索引MongoDB。
确保一切都是最新的。
sudo apt-get update
安装NodeJS。
sudo apt-get install nodejs sudo apt-get install npm
安装MongoDB – 这些步骤直接来自MongoDB文档。 select你喜欢的任何版本。 我坚持使用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
然后select你的版本,如果你不想要最近的。 如果您将环境设置在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 shell创build一个数据库,并向其中推送一些虚拟数据。
mongo YOUR_DATABASE_NAME db.createCollection(YOUR_COLLECTION_NAME) for (var i = 1; i <= 25; i++) db.YOUR_COLLECTION_NAME.insert( { x : i } )
现在将独立的MongoDB转换成副本集 。
首先closures该过程。
mongo YOUR_DATABASE_NAME use admin db.shutdownServer()
现在我们将MongoDB作为服务运行,所以当我们重启mongod进程时,我们不会在命令行参数中传入“–replSet rs0”选项。 相反,我们把它放在mongod.conf文件中。
vi /etc/mongod.conf
添加这些行,subbing你的数据库和日志path。
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。 我只是关注这个有用的Gist 。
确保安装了Java。
sudo apt-get install openjdk-7-jre-headless -y
现在坚持使用v1.1.x,直到v1.2.1中修复了Mongo-River插件bug。
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具有以下configuration选项,如果您现在只在单个节点上开发:
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
这两个插件不是必需的,但它们可以很好地testing查询和可视化对索引的更改。
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'
去玩。
当你的经营规模扩大时,使用河stream可能会带来问题 在繁重的工作中,River将会使用大量的内存。 我build议实施你自己的elasticsearch模型,或者如果你使用mongoose,你可以build立你的弹性search模型,或者使用mongoosastic ,这本质上是为你做的。
Mongodb River的另一个缺点是你会被mongodb 2.4.x分支和ElasticSearch 0.90.x卡住。 你会发现你错过了很多非常好的function,而mongodb河项目并没有产生足够快的可用产品来保持稳定。 这说Mongodb河绝对不是我要投入生产的东西。 它提出了比它的价值更多的问题。 它将在重负载下随机丢弃写入,会消耗大量内存,并且没有设置来限制。 此外,河stream不会实时更新,它会读取来自MongoDB的oplog,这可能会延迟更新,长达5分钟。
我们最近不得不重写了大部分的项目,因为每周发生一次ElasticSearch出现问题。 我们甚至还聘请了DevOps顾问,他也同意最好离开河stream。
更新: Elasticsearch-mongodb河现在支持ES v1.4.0和mongodb v2.6.x. 但是,在插入/更新操作繁重时,您仍然可能遇到性能问题,因为此插件会尝试读取mongodb的oplog进行同步。 如果自锁(或者说locking器)解锁之后有很多操作,您会注意到elasticsearch服务器上的内存使用量非常高。 如果您计划进行大规模的手术,河stream不是一个好select。 ElasticSearch的开发人员仍然build议您通过使用您的语言的客户端库直接与其API进行通信来pipe理自己的索引,而不是使用河stream。 这不是真正的河stream的目的。 推特河是应该如何使用河stream的一个很好的例子。 它本质上是从外部来源获取数据的好方法,但对于高stream量或内部使用来说不是很可靠。
也可以认为mongodb-river在版本上落后了,因为它没有被ElasticSearch Organization维护,它由第三方维护。 在v1.0发布之后,开发者在v0.90分支上停留了很长一段时间,而当v1.0版本发布之后,在elasticsearch发布v1.3.0之前,这个版本并不稳定。 Mongodb版本也落后了。 当你想要转向更高版本的时候,你可能会发现自己处于一个狭窄的位置,特别是在如此重大的开发中的ElasticSearch,以及许多非常值得期待的function。 保持最新的ElasticSearch非常重要,因为我们严重依赖于不断改进searchfunction,将其作为我们产品的核心部分。
总而言之,如果你自己做,你可能会得到更好的产品。 这并不困难。 它只是另一个数据库来pipe理你的代码,它可以很容易地被丢弃到现有的模型没有重大的重构。
这里如何在mongodb 3.0上做到这一点。 我用这个漂亮的博客
- 安装mongodb。
- 创build数据目录:
$ mkdir RANDOM_PATH/node1 $ mkdir RANDOM_PATH/node2> $ mkdir RANDOM_PATH/node3
- 启动Mongod实例
$ mongod --replSet test --port 27021 --dbpath node1 $ mongod --replSet test --port 27022 --dbpath node2 $ mongod --replSet test --port 27023 --dbpath node3
- configuration副本集:
$ mongo config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]}; rs.initiate(config);
- 安装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.
- 安装和configurationMongoDB River:
$ bin / plugin –install com.github.richardwilly98.elasticsearch / elasticsearch-river-mongodb
$ bin / plugin –install elasticsearch / elasticsearch-mapper-attachments
- 创build“河”和索引:
curl -XPUT'http :// localhost:8080 / _river / mongodb / _meta' -d'{“type”:“mongodb”,“mongodb”:{“db”:“mydb”,“collection”:“foo” },“index”:{“name”:“name”,“type”:“random”}}
-
在浏览器上testing:
HTTP://本地主机:9200 / _search Q =家庭
我发现mongo连接器很有用。 它是Mongo Labs(MongoDB Inc.)的forms,现在可以用于Elasticsearch 2.x
Elastic 2.x文档pipe理器: https : //github.com/mongodb-labs/elastic2-doc-manager
mongo-connector创build一个从MongoDB集群到一个或多个目标系统(如Solr,Elasticsearch或其他MongoDB集群)的pipe道。 它将MongoDB中的数据同步到目标,然后跟踪MongoDB oplog,实时跟踪MongoDB中的操作。 已经使用Python 2.6,2.7和3.3+进行了testing。 维基上提供了详细的文档。
https://github.com/mongodb-labs/mongo-connector https://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch