目录 [−]
Elasticsearch是一个分布式可扩展的实时搜索和分析引擎。它能帮助你搜索、分析和浏览数据。Elasticsearch 是一个基于Lucene实现的搜索服务器,用Java开发实现。它提供了RESTful web接口,并作为Apache许可条款下的开放源码发布,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
Elasticsearch关键概念
本文不是介绍Elasticsearch的安装配置文档,这些文档你可以在本文的参考资料中获得, 而是笔者在项目中的实践笔记。
我最近在开发过程中需要将Mongo数据库中的文章进行索引, 避免直接对Mongo数据库进行搜索导致的性能降低。基于Elasticsearch的手册的描述,以及在一些大公司如twitter的应用的经验,我选用它作为现在的项目的索引服务器。
现在的项目是Golang语言实现的,所以我调研的目标放在了Golang + MongoDB + Elasticsearch上面。
elasticsearch-river-mongodb是一个针对Mongo的elasticsearch river的插件。它从Mongo oplog中读取信息,将Mongo集群中的数据导入到 elasticsearch 中。考虑到river被弃用,暂时不考虑这个方案。
mandeepm91在文章 How To Sync Transformed Data from MongoDB to Elasticsearch with Transporter on Ubuntu 14.04提到了另外一个工具 Transporter,这是一个相当好的工具,可以抽取Mongo单例或者Mongo集群的数据,然后使用otto框架进行Javascript处理,而且处理是通道式的。在调研中很容易的将Mongo数据库导入到Elasticsearch。
不过我也没有采用这个方案。因为我的项目中,对文章的增删改的动作比较少,可以直接调用Elasticsearch的API进行操作。而且这样可以做到数据的实时索引和查询。
上面的方案多少会影响服务器的性能,有可能会block在Elasticsearch的API调用上。 所以我在增删改文章时,将操作命令的log放入到一个消息服务器中(nsq或者kafka),然后在单独的一台服务器上接收消息并调用Elasticsearch的API。
参考资料
- https://www.digitalocean.com/community/tutorials/how-to-sync-transformed-data-from-mongodb-to-elasticsearch-with-transporter-on-ubuntu-14-04
- https://github.com/compose/transporter
- Elasticsearch 权威指南
- elasticsearch中文指南
- https://www.elastic.co/guide/en/elasticsearch/guide/current/_empty_search.html
- https://github.com/mattbaird/elastigo
- https://github.com/olivere/elastic
- https://github.com/richardwilly98/elasticsearch-river-mongodb
- http://baike.baidu.com/item/elasticsearch
- https://www.elastic.co/blog/deprecating-rivers