因为项目中需要对mongodb中数据实现全文检索的功能,但mongodb的全文检索不支持英文。而 elasticsearch 可以很好的支持各种语言的全文检索。当然我们可以在保存数据到mongodb的同时保存到elasticsearch中一份,但需要大面积修改原本的业务逻辑,并不可行。所以我们无疑就想到了同步。同步的几种方案大概可以参照这篇文章:5 ways to synchronize data from MongoDb to ElasticSearch。对于实际的项目来说,同步方案可以使用 river 或 mongo-connector。但前者已经不再维护了,后者则得到了 mongo 官方的支持,因此选用它作为同步方案。接下来就说一下步骤吧。
1、搭建mongodb副本集
使用mongo-connector同步数据首先需要确保mongodb为副本集,这一步是必不可少的,因为ES是通过mongodb的oplog去建立索引,如果不是副本集就没有oplog,当然也就无法建立索引了。如何搭建mongodb副本集请参考这篇文章:mongodb副本集的搭建
2、下载安装elasticsearch
下载安装elasticsearch比较简单,但还是有很多坑的,这里给出下载安装链接:Linux下elasticsearch的安装配置以及head插件的安装使用
3、下载安装mongo-connector
比较简单,参照:https://github.com/mongodb-labs/mongo-connector
4、同步数据
① 启动mongodb副本集群
② 启动elasticsearch集群
③ 启动mongo-connector。我这里的启动命令为:mongo-connector -m 192.168.198.224:27017 -t 192.168.198.223:9200 -d elastic2_doc_manager。(mongodb中的数据库对应es中的index,表名对应es中index的type,es会自动创建索引和映射,不过在同步之前手动创建映射会比较好。)
④ 启动本地的elasticsearch-head。浏览器进入localhost:9100查看集群状态以及数据是否同步。
5、ik分词器的安装与使用
由于elasticsearch内置的分词器对于中文并不友好,会把中文的一句话分割成一个个的汉字,不能很好的达到我们想要的效果。我们可以使用ik分词器插件就可以很好地解决问题了。ik分词器的安装:elasticsearch 中文ik分词器的安装使用
6、使用node.js来查询elasticsearch中的数据
下载elasticsearch的node.js的npm模块包:https://github.com/elastic/elasticsearch-js
elasticsearch-js API:
https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html
连接elasticsearch的代码示例如下:
varelasticsearch =require('elasticsearch');varclient =newelasticsearch.Client({
host:'localhost:9200',
log:'trace'
});
查询示例如下:
client.search({
index: 'myindex',
q: 'title:test'
}, function (error, response) {
// ...
});
写的比较简单,参考资料:
使用 Elasticsearch 实现博客站内搜索