用 mongodb + elasticsearch 实现中文检索

原创 2015年08月21日 21:24:06

而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端数据库。

当然,可以在 web 应用中存储数据的时候,再主动写一份到 elasticsearch,但这无疑污染了原有的业务逻辑。

在 IT 行业,只要有需求的地方,必然早已有了一堆好用或者不好用的开源轮子。

幸运地是,现在已经有了一些转换方案,可以将 mongodb 中的数据自动导入到 elasticsearch 中,让 elasticsearch 提供中文智能检索。

转换方案主要包括 river 和 mongo-connector。前者已经不再维护了,后者则得到了 mongo 官方的支持,因此选用它作为转换方案。

mongo-connector

基于 python 编写,安装和使用都十分简单。

$ pip install mongo-connector
$ mongo-connector --auto-commit-interval=0 -m mongo:27017 -t elasticsearch:9200 -d elastic_doc_manager

auto-commit-interval 是提交延迟,0 表示即时写入,-m 和 -t 分别指定 mongo 和 elasticsearch 地址即可。

需要注意的是,mongo 需要配置为 cluster 模式。

配置环境

用户可以自行配置 mongo 和 elasticsearch 环境,并通过 mongo-connector 连接起来。

这里已经提供好了 docker-compose 模板,可以使用 docker 容器一键创建包括 mongo、mongo-connector、elasticserach 的环境。需要提前安装 Docker 和 docker-compose 环境。

$ git clone https://github.com/yeasy/docker-compose-files.git
$ cd mongo-elasticsearch; docker-compose up

通过 docker inspect container_id |grep Addr 可以查看容器的 IP 地址。

测试

在 mongo 容器中写入数据

> use test
> db.col.insert({name:"王晓明", birth:"1980-01-01"})
> db.col.insert({name:"王东东", birth:"1981-01-01"})
> db.col.insert({name:"张丽敏", birth:"1982-01-01"})

通过 elasticsearch 容器进行检索

curl -XGET -H 'charset=UTF-8' elasticsearch:9200/test/col/_search -d '{ "query" : { "match" : { "name" : "王" } } }'
{"took":74,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max_score":0.5,"hits":[{"_index":"test","_type":"col","_id":"55d6d4640e247e587cfc73ca","_score":0.5,"_source":{"name": "\u738b\u4e1c\u4e1c", "birth": "1981-01-01"}},{"_index":"test","_type":"col","_id":"55d6d45d0e247e587cfc73c9","_score":0.15342641,"_source":{"name": "\u738b\u6653\u660e", "birth": "1980-01-01"}}]}}

转载请注明:http://blog.csdn.net/yeasy/article/details/47842437

MongoDB 索引之全文索引

mongodb full text search(fts:全文搜素)是在版本2.4新加的特性。在以前的版本,是通过精确匹配和正则表达式来查询,这效率是很低的。全文索引,能够从大量的文本中搜索出所需的内...
  • tianwei7518
  • tianwei7518
  • 2015年03月19日 21:34
  • 4325

全文检索引擎Solr系列——整合MySQL、MongoDB

全文检索引擎Solr系列——整合MySQL、MongoDB
  • makang110
  • makang110
  • 2016年03月18日 17:54
  • 1564

mongoDB 全文搜索 TextSearch

snowball(默认分词器)只有在Mongodb 3.2之后的企业版中才开始加入了对中文的支持,之前或者社区的版本在建立全文索引时会自动过滤中文字符。 在Mongodb 3.2企业版中,对中文...
  • paul_wei2008
  • paul_wei2008
  • 2017年05月04日 17:27
  • 1167

MongoDB全文索引用法

全文索引的创建方法:db.ensureIndex({key:"text"})db.ensureIndex({key1:"text",key2:"text"})db.ensureIndex({"$*...
  • lichangzai
  • lichangzai
  • 2016年03月29日 18:02
  • 3538

mongodb遍历万亿级数据,论索引的重要性

【背景】有160万用户账号数据,200万终端账号数据,需要在160万用户账号数据中排除所有账号数据,那就需要遍历 160万 * 200万 = 3200000000000 次运算 ,3万2000亿次! ...
  • carterslam
  • carterslam
  • 2017年12月13日 11:28
  • 76

mongodb 中文全文检索 Coreseek

必须  http://www.coreseek.cn/
  • zzllabcd
  • zzllabcd
  • 2014年08月15日 14:06
  • 3856

mongoDB v2.4 使用全文索引

mongoDB2.4新增的全文索引的支持:现在把官方教程翻译过来: 开启全文索引 可以在脚本中声明启用: db.adminCommand( { setParameter : 1, textSearc...
  • black_OX
  • black_OX
  • 2014年03月19日 18:02
  • 4732

五种方式将数据从MongoDB同步到ElasticSearch

Elastic search(ES) is a pop-star for recording and analyzing data, andMongodb is a famous NoSQL da...
  • feixiangtianshi
  • feixiangtianshi
  • 2016年12月30日 10:31
  • 2965

mongo-connector实现MongoDB与elasticsearch实时同步深入详解

引言:验证表明:mongo-connector工具支持MongoDB与ES之间的实时增insert、删delete、改update操作。 对于历史数据,mongo-connector工具不能同步到E...
  • wojiushiwo987
  • wojiushiwo987
  • 2016年07月06日 22:20
  • 15744

elasticsearch vs mongodb

选择Elasticsearch还是选择MongoDB,该问题我已经被许多初学者、朋友或需要作出技术架构决策的开发者问及好多次了。那么应该选择MongoDB,还是选择ElasticSearch呢?因此,...
  • aWDac
  • aWDac
  • 2017年09月27日 21:20
  • 371
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用 mongodb + elasticsearch 实现中文检索
举报原因:
原因补充:

(最多只允许输入30个字)