天天看点

【玩转ElasticSearch】横向对比ElasticSearch与Sphinx

【玩转ElasticSearch】横向对比ElasticSearch与Sphinx

打算写几篇elasticsearch使用心得。

第一篇,先从elasticsearch与sphinx的横向对比开始。横向对比是反应优点和暴露问题的好方法。我是sphinx阵营转向elasticsearch阵营的,两者都是成熟的开源搜索引擎,各有优劣,这篇文章也可以给纠结使用哪套方案的同学提供一些选择的依据。

• 导入mysql数据生成索引

sphinx:原生支持基于mysql的表建索引

elasticsearch官方文档上,数据都是使用restful接口一条一条插入的,也就是增量更新。在数据量非常大的时候,遍历全表重建一次索引会非常消耗时间。而elasticsearch-rivel-mysql这个项目并不是很靠谱,开发者甚至曾经在git上标明deprecated(现在没了)。反正我是自己另外写了一套。

在导入mysql数据生成索引时,从易用性、可靠性、速度上来看,sphinx优于elasticsearch。

• 增量更新支持

elasticsearch优于sphinx。elasticsearch把增量更新作为首选curd方式;而sphinx使用辅助表的方案不但不优雅,还会让你的其他系统变得复杂起来,在你频繁更改单条数据的时候很容易出错。

• 可视化与辅助工具

kibana是elasticsearch提供的图形化界面,基本功能有:1)读取一个index 2)对一个index写query查询出具体数据 3)通过这些数据生成图表 4)拉几个图表生成一个报表。kibana非常强大,根据这些基础功能,我们已经可以自由定制完成各种复杂需求了。kibana还可以加各种插件,其中最常用的是marvel(性能、状态监控)与logstash(数据收集),非常好用。

反观sphinx tools,还停留在性能监控的阶段,而且还在内测,被elasticsearch的kibana+全家桶甩太远了。

• 搜索算法支持

总的来说,elasticsearch稍微优于sphinx。

• 横向扩展与高可用

elasticsearch是天生为了集群化而设计的。索引如果没有replica就会显示黄灯,有才会亮绿灯。每个节点分为client node、data node、master node三种角色,在合理的配置之下,任意一台(甚至多台)机器炸了,整个集群都能正常运行。elasticsearch还支持动态加机器等等功能,暂不赘述。

sphinx也有master searchd和slave searchd的概念,可以分布式,但想实现高可用就相当复杂了。

elasticsearch优于sphinx。sphinx的劣势不在于做不到,而在于不好用。

• 资源占用

sphinx优于elasticsearch。

不得不说,java在这方面比不上c++。cpu还好,差距不大,内存占用方面真心天差地别。

• 搜索速度

搜索速度主要看怎么配置cluster,越多搜起来就越快。

• nlp支持

这里只说中文nlp。

sphinx:曾经有个叫coreseek的项目,可惜没有继续维护了。

其实双方都可以开发第三方插件,接入国内的ltp或者ictclas都不难。

• 总结

sphinx和elasticsearch都是很优秀的方案,都经历了实战的考验。当时为什么我从sphinx倒戈去了elasticsearch,主要原因是:

1)我有定制ranker的需求,elasticsearch的functional score query刚好满足了我

2)业务越来越大,elasticsearch有更强的横向扩展能力和高可用性

3)可以用kibana整出好看的报表啊!

现在回头一看,elasticsearch发力非常猛,版本迭代如火箭一般,社区也很活跃。我认为这个选择没有出错。

【玩转ElasticSearch】横向对比ElasticSearch与Sphinx

继续阅读