当前是云计算和数据快速增加的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求。随着数据的堆积,如何快速有效的搜索这些数据,成为对后端服务的挑战。本文,咱们将比较业界两个最流行的开源搜索引擎,Solr和ElasticSearch。二者都创建在Apache Lucene开源平台之上,它们的主要功能很是类似,可是在部署的易用性,可扩展性和其余功能方面也存在巨大差别。html
Apache Solr基于业界大名鼎鼎的java开源搜索引擎Lucene,Lucene更多的是一个软件包,还不能称之为搜索引擎,而solr则完成对lucene的封装,是一个真正意义上的搜索引擎框架。在过去的十年里,solr发展壮大,拥有普遍的用户群体。solr提供分布式索引、分片、副本集、负载均衡和自动故障转移和恢复功能。若是正确部署,良好管理,solr就可以成为一个高可靠、可扩展和高容错的搜索引擎。很多互联网巨头,如Netflix,eBay,Instagram和Amazon(CloudSearch)均使用Solr。java
solr的主要特色:算法
与solr同样,Elasticsearch构建在Apache Lucene库之上,同是开源搜索引擎。Elasticsearch在Solr推出几年后才面世的,经过REST和schema-free(不须要预先定义 Schema,solr是须要预先定义的)的JSON文档提供分布式、多租户全文搜索引擎。而且官方提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript客户端。数据库
分布式搜索引擎包含能够华为为分片(shard)的索引,每个分片能够有多个副本(replicas)。每一个Elasticsearch节点能够有一个或多个分片,其引擎既同时做为协调器(coordinator ),将操做转发给正确的分片。apache
Elasticsearch可扩展为准实时搜索引擎。其中一个关键特性是多租户功能,可根据不一样的用途分索引,能够同时操做多个索引。后端
Elasticsearch主要特性:架构
热度对比 负载均衡
在开始比较前,咱们能够查看二者在google中的搜索热度,能够看出在2013年后,Elasticsearch与Solr相比具备很大的吸引力,但这并不意味着Apache Solr已经死了。虽然很多人不承认,但Solr仍然是最流行的搜索引擎之一,具备强大的开源社区支持。 框架
安装与配置 elasticsearch
相对来讲,Elasticsearch更易于安装,与Solr相比很是轻量级。 Solr的分发软件包大小的当前版本(6.4.2)大约为150 MB,而Elasticsearch分发软件包大小的当前版本(5.2.2)仅为32.2MB。
可是,若是Elasticsearch管理很差,这种易于部署和使用可能会成为一个问题。基于JSON的配置很容易,但若是你想为文件中的每一个配置指定注释,那么它不适合你。Solr也提供了Rest API,能够经过集合API建立自定义分片集合,记录聚类算法和执行自定义分片。
总的来讲,若是你的应用程序使用JSON,那么Elasticsearch是一个更好的选择。不然,使用Solr,由于它的schema.xml和solrconfig.xml有很好的文档。
索引和搜索
数据源
Solr接受来自不一样来源的数据,包括XML文件,逗号分隔符(CSV)文件和从数据库中的表提取的数据以及常见的文件格式(如Microsoft Word和PDF)。
Elasticsearch还支持其余来源的数据,例如ActiveMQ,AWS SQS,DynamoDB(Amazon NoSQL),FileSystem,Git,JDBC,JMS,Kafka,LDAP,MongoDB,neo4j,RabbitMQ,Redis,Solr和Twitter。还有各类插件可用。
搜索
Solr专一于文本搜索,而Elasticsearch则经常使用于查询、过滤和分组分析统计,Elasticsearch背后的团队也努力让这些查询更为高效。所以当比较二者时,对那些不只须要文本搜索,同时还须要复杂的时间序列搜索和聚合的应用程序而言,毫无疑问Elasticsearch是最佳选择。
索引
二者都支持使用停用词和同义词来匹配文档。
在Solr中,索引间进行join必须是单个分片和其余节点上的副本集进行关联来搜索文档间关系(例如SQL链接)。而Elasticsearch提供更高效的has_children和top_children查询来检索这样的相关文档。
可扩展性和分布式
搜索引擎须要处理数以百万级的文档,基于此搜索引擎应该是可复制的,模块化的和可扩展的,支持集群和分布式架构。
专为云而设计
Elasticsearch很是易于扩展,拥有足够多的须要大集群的使用案例。
Solr 基于Apache ZooKeeper也实现了相似ES的分布式部署模式。ZooKeeper是成熟和普遍使用的独立应用程序。
相对比,Elasticsearch有一个内置的相似ZooKeeper的名为Zen的组件,经过内部的协调机制来维护集群状态。
能够说Elasticsearch是转为云而设计,是分布式首选。
分片拆分和再平衡
shards是luence索引的分区单元,solr和elasticsearch均使用。你能够经过在集群中的不一样计算机上运行shard来分发索引。随着SolrCloud的引入,Solr开始支持shard拆分,这容许您经过拆分现有shard来添加更多shard。相比之下,ElasticSearch仍然不支持这一点,事实上,实际上阻止了这种作法。ES经过向设置中添加更多计算机,可使用自动碎片平衡功能。相比之下,Solr容许添加分片(使用隐式路由时)或分割(使用复合ID时),但不能删除分片。它容许您增长副本。在Elasticsearch中,默认状况下每一个索引具备五个分片。它不容许您更改主分片的数量,但它容许您增长副本的数量。分片再平衡对于水平扩容很是有用。当添加新机器时,它将自动从新平衡不一样机器中可用的分片。
社区
Solr有一个普遍的开源社区。任何人均可以贡献给Solr,新的Solr开发人员或代码提交者只能根据功能选择。 Elasticsearch在技术上是开源的,但不彻底。全部贡献者均可以访问源代码,用户能够进行更改并提供。但最终的变化由Elastic(运行Elasticsearch和其余软件的公司)的员工确认和完成。所以,Elasticsearch更多地由单个公司驱动,而不是整个社区。
Solr贡献者和提交者跨越多个组织,而Elasticsearch提交者仅来自Elastic。还有人指出,Solr的强大社区有一个健康的项目管道和许多知名公司参与。这些成员还经过在整个开发和工程过程当中作出贡献来投资该平台。
二者都有很好的用户群和丰富的开发人员社区,但ElasticSearch相较于Solr更新。 Solr已经存在了更长的时间,因此它的生态系统是发达的,拥有更大的用户群。
文档
Solr在这里得分很高。它是一个很是有据可查的产品,具备清晰的示例和API用例场景。 Elasticsearch的文档组织良好,但它缺少好的示例和清晰的配置说明。
选Solr 仍是 Elasticsearch?
经过上面的对比,很难肯定谁是最终赢家。其实,不管选择Solr仍是Elasticsearch,你首先须要了解您的用户场景和将来的需求。咱们来总结一下:
请记住:
总之,二者都是功能丰富的搜索引擎,而且或多或少地给出相同的性能,只要它们被设计和实施得很好。
本文主要内容为翻译http://logz.io/blog/solr-vs-elasticsearch/,感谢做者,感谢谷歌翻译!