我们产品中需要全文检索的功能,后端数据存储主要使用了 MySQL + MongoDB,而其中需要检索的内容是在 MongoDB 中的。
MongoDB 本身是自带文本索引功能的,但是,不支持中文。术业有专攻,MongoDB 是数据存储应用,那么全文检索就使用专业的全文搜索引擎吧。
预选的几个选手有:Solr、ElasticSearch、Xapian、Sphinx、XunSearch。由于我们的数据量比较大,觉得现在单机已经有些力不从心了,MongoDB 也开始计划做分片,那么全文搜索如果自带分布式技能那就最合适不过了。经过一系列的考量,最后,我们就决定用 ElasticSearch 了。
现在后端程序是直接将数据写到 MongoDB 中,我不想修改程序代码,不想在增删改 MongoDB 中数据的同时去增删改 ElasticSearch 中的数据。希望 MongoDB 中数据发送变化时自动同步到 ElasticSearch 中,这样就可以最快地用上 ElasticSearch 了。
刚开始我找到的方案是利用 ElasticSearch 的 River 来同步数据,并在 GitHub 上到了 MongoDB River 插件:elasticsearch-river-mongodb。但是,随后我又在 ElasticSearch 官网上看了这篇博客:《Deprecating Rivers》,官方已经在 1.5 以后的版本弃用 River,为了用户的迁移,会一直保留到 2.0 版本。
于是,我得另寻方案了。然后我又在网上找到了另外一个方案:mongo-connector。这个是 MongoDB 官方的开发人员用 Python 写的一个工具,目前支持将 MongoDB 的数据同步到 Solr、ElasticSearch、MongoDB 中,并且支持用户自己扩展。看到 README 中的免责声明,我有点觉得这是玩票性质的工具,但是还是抱着试试看的心态决定试试看了。
下面是部署过程:
-
MongoDB 必须开启复制集,如果已经开启请忽略这一步:
配置复制集的名称:mongod --replSet myDevReplSet
在 mongo shell 中初始化复制集:rs.initiate()
-
安装 ElasticSearch,如果已经安装请忽略这一步。
-
安装 mongo-connector:
先安装 pip:yum install python-setuptools && easy_install pip
通过 pip 安装 mongo-connector:
pip install mongo-connector
-
运行 mongo-connector:
mongo-connector -m 127.0.0.1:27017 -t 127.0.0.1:9200 -d elastic_doc_manager
OK,现在,在 MongoDB 中增删改数据,都能立刻同步到 ElasticSearch 中了。在试用过程中,mongo-connector 退出过两次,其中一次断开太久没有发觉,害我不得不重新同步。还是有点不靠谱的感觉,可能还得专门写个守护程序,让 mongo-connector 一直能在后台好好干活。
拓展阅读: