如何在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上做到这一点。 我用这个漂亮的博客

  1. 安装mongodb。
  2. 创build数据目录:
 $ 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. configuration副本集:
 $ 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. 安装和configurationMongoDB River:

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

$ bin / plugin –install elasticsearch / elasticsearch-mapper-attachments

  1. 创build“河”和索引:

curl -XPUT'http :// localhost:8080 / _river / mongodb / _meta' -d'{“type”:“mongodb”,“mongodb”:{“db”:“mydb”,“collection”:“foo” },“index”:{“name”:“name”,“type”:“random”}}

  1. 在浏览器上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