Solr vs. ElasticSearch

Ben*_*Day 723 lucene search solr elasticsearch

这些技术之间的核心架构差异是什么?

另外,哪些用例通常更适合每种用例?

Ste*_*pel 554

更新

既然问题范围已得到纠正,我也可以在这方面添加一些内容:

Apache SolrElasticSearch之间有很多比较,所以我会参考我自己认为最有用的那些,即涵盖最重要的方面:

  • Bob Yoplait已经将kimchy的答案与ElasticSearch,Sphinx,Lucene,Solr,Xapian联系起来.哪种适合哪种用途?,总结了他继续创建ElasticSearch的原因,他认为ElasticSearch与Solr相比提供了更优越的分布式模型和易用性.

  • Ryan Sonnek的实时搜索:Solr vs Elasticsearch提供了深刻的分析/比较,并解释了为什么他从Solr切换到ElasticSeach,尽管他已经是一个快乐的Solr用户 - 他总结如下:

    在构建标准搜索应用程序时,Solr可能是首选武器,但Elasticsearch通过用于创建现代实时搜索应用程序架构将其提升到新的水平 .渗透是一个令人兴奋和创新的特点,单独将Solr从水中吹走.Elasticsearch具有可扩展性,快速性和集成的梦想.Adios Solr,知道你很高兴.[强调我的]

  • 关于ElasticSearch的维基百科文章引用了着名的德国iX杂志的比较,列出了优点和缺点,几乎总结了上面已经说过的内容:

    优点:

    • ElasticSearch是分布式的.不需要单独的项目.副本也接近实时,称为"推送复制".
    • ElasticSearch完全支持Apache Lucene的近实时搜索.
    • 处理多租户不是一种特殊的配置,使用Solr需要更高级的设置.
    • ElasticSearch引入了Gateway的概念,使完整备份更容易.

    缺点:

    • 只有一个主要开发人员 [根据目前的弹性搜索GitHub组织不再适用,除了首先拥有一个相当活跃的提交者基础]
    • 没有自动装配功能 [根据新的Index Warmup API不再适用]

初步答复

它们是针对完全不同的用例的完全不同的技术,因此无法以任何有意义的方式进行比较:

  • Apache Solr - Apache Solr在易于使用,快速搜索服务器中提供Lucene的功能,具有分面,可扩展性等更多功能

  • Amazon ElastiCache - Amazon ElastiCache是​​一种Web服务,可以轻松部署,操作和扩展云中的内存缓存.

    • 请注意,Amazon ElastiCache与Memcached(一种广泛采用的内存对象缓存系统)协议兼容,因此您现在使用现有Memcached环境的代码,应用程序和流行工具将与该服务无缝协作(有关详细信息,请参阅Memcached).

[强调我的]

也许这已经与以下两种相关技术混淆了:

  • ElasticSearch - 它是一个基于Apache Lucene构建的开源(Apache 2),分布式,RESTful,搜索引擎.

  • Amazon CloudSearch - Amazon CloudSearch是云中的一个完全托管的搜索服务,允许客户轻松地将快速和高度可扩展的搜索功能集成到他们的应用程序中.

Solr的ElasticSearch产品听起来一见钟情惊人地相似,都使用同样的后端搜索引擎,即Apache的Lucene的.

虽然Solr较老,功能多样且成熟且相应地广泛使用,但ElasticSearch专门用于解决Solr在现代云环境中具有可扩展性要求的缺点,而Solr很难解决这一问题.

因此,将ElasticSearch与最近推出的Amazon CloudSearch进行比较可能是最有用的(请参阅介绍性文章在一小时内以低于100美元/月的价格开始搜索),因为两者都声称原则上涵盖了相同的用例.

  • iX杂志部分列出的ElasticSearch的所有优点现在也是错误的.1)SolrCloud不再是一个单独的项目.事实上,Solr和Lucene现在是同一个项目的一部分.2)Solr支持NRT.3)Solr处理单个集群中的多个集合4)Solr还添加了一个复制功能,使备份更容易. (37认同)
  • 既然[elasticsearch](http://elasticsearch.com)背后有一家公司,那么一个主要的开发者劣势就应该消失了. (6认同)
  • ElasticSearch现在似乎解决了autowarming问题.请参阅https://github.com/elasticsearch/elasticsearch/issues/1913 (2认同)
  • 不要忘记ElasticSearch为那些需要OLAP功能的人提供的聚合.Solr云只有有限的分面.如果您需要有关聚合的警报,ES渗透会提供. (2认同)

Oti*_*tic 204

我看到上面的一些答案现在有些过时了.从我的角度来看,我每天都与Solr(云和非云)和ElasticSearch合作,这里有一些有趣的差异:

  • 社区:Solr拥有更大,更成熟的用户,开发者和贡献者社区.ES拥有一个规模较小但活跃的用户社区和不断增长的贡献者社区
  • 成熟度:Solr更成熟,但ES增长迅速,我认为它稳定
  • 表现:很难判断.我/我们还没有做过直接的性能基准测试.LinkedIn上的一个人确实比较了Solr vs. ES与Sensei的比较,但最初的结果应该被忽略,因为他们使用Solr和ES的非专家设置.
  • 设计:人们喜欢Solr.Java API有点冗长,但人们喜欢它是如何组合在一起的.遗憾的是,Solr代码并不总是很漂亮.此外,ES还具有内置分片,实时复制,文档和路由功能.虽然其中一些也存在于Solr中,但感觉有点像经过深思熟虑.
  • 支持:有些公司为Solr和ElasticSearch提供技术和咨询支持.我认为唯一为两者提供支持的公司是Sematext(披露:我是Sematext的创始人)
  • 可伸缩性:两者都可以扩展到非常大的集群.ES比Solr 4.0前版本的Solr更容易扩展,但是Solr 4.0已经不再适用了.

有关Solr与ElasticSearch主题的更全面介绍,请查看http://blog.sematext.com/2012/08/23/solr-vs-elasticsearch-part-1-overview/.这是Sematext系列帖子中第一篇发表直接和中立的Solr与ElasticSearch比较的帖子.披露:我在Sematext工作.


Gle*_*enn 23

我看到很多人已经在功能和功能方面回答了这个ElasticSearch vs Solr问题,但我没有在这里(或其他地方)看到他们在性能方面的比较.

这就是为什么我决定进行自己的调查.我采用了已编码的异构数据源微服务,该服务已经使用Solr进行术语搜索.我为ElasticSearch切换了Solr,然后我在AWS上使用已编码的负载测试应用程序运行了两个版本,并捕获了后续分析的性能指标.

这是我发现的.在索引文档时,ElasticSearch的吞吐量提高了13%,但Solr的速度提高了十倍.在查询文档时,Solr的吞吐量是ElasticSearch的五倍,速度快了五倍.


min*_*xue 16

自从Apache Solr历史悠久以来,我认为Solr的一个优势就是它的生态系统.有许多Solr插件可用于不同类型的数据和用途.

solr堆栈

从下到上搜索以下层中的平台:

  • 数据
    • 目的:代表各种数据类型和来源
  • 文件编制
    • 目的:构建索引的文档信息
  • 索引和搜索
    • 目的:构建和查询文档索引
  • 逻辑增强
    • 目的:用于处理搜索查询和结果的附加逻辑
  • 搜索平台服务
    • 目的:添加搜索引擎核心的其他功能以提供服务平台.
  • UI应用程序
    • 目的:最终用户搜索界面或应用程序

参考文章:企业搜索


小智 14

我创建了一个弹性搜索与Solr和splunk之间的主要差异表,您可以将其用作2016更新: 在此输入图像描述

  • 数据模式行有点误导......弹性有映射,本质上是一个模式(但默认情况下不需要)。Solr 提供了一种必须安装配置才能工作的配置,有几种提供的示例配置可供您立即选择,其中一种是无模式的,尽管在使用 solr 时,仔细控制的模式可能更常见。 (2认同)
  • Solr Streaming API提供MapReduce功能 (2认同)

小智 13

我一直在研究.Net应用程序的solr和弹性搜索.我遇到的主要区别是

弹性搜索:

  • 更多的代码和更少的配置,但有更改api,但仍然是代码更改
  • 对于复杂类型,在类型中键入,即嵌套类型(无法在solr中实现)

Solr:

  • 代码更少,配置更多,因此维护更少
  • 用于在查询期间对结果进行分组(很多工作要么在弹性搜索中完成,而不是直接的方式)


小智 7

虽然上述所有链接都具有优点,并且过去使我受益匪浅,但作为语言学家在过去的15年中"暴露"到各种Lucene搜索引擎,我不得不说Python中的弹性搜索开发速度非常快.话虽这么说,有些代码对我来说不直观.因此,我从开源的角度联系了ELK堆栈的一个组件Kibana,发现我可以在Kibana中轻松生成一些有点神秘的弹性搜​​索代码.此外,我也可以将Chrome Sense es查询拉入Kibana.如果您使用Kibana评估es,它将进一步加快您的评估速度.在其他平台上运行花费数小时的时间是在弹性搜索(RESTful接口)之上的Sense中以最差的几分钟(最大数据集)在JSON中运行; 在几秒钟内充其量.elasticsearch的文档虽然超过700页,却没有回答我通常会在SOLR或其他Lucene文档中解决的问题,这显然需要更多的时间来分析.此外,您可能需要查看弹性搜索中的聚合,这会使Faceting达到一个新的水平.

更大的图片:如果您正在进行数据科学,文本分析或计算语言学,那么elasticsearch有一些排名算法似乎在信息检索领域创新.如果你正在使用任何TF/IDF算法,文本频率/逆文档频率,elasticsearch将这个1960年代的算法扩展到一个新的水平,甚至使用BM25,最佳匹配25和其他相关性排名算法.因此,如果您对单词,短语或句子进行评分或排名,那么elasticsearch可以即时进行评分,而不需要花费数小时的其他数据分析方法的大量开销 - 另一个弹性搜索时间节省.使用es,将聚合中的一些优势与实时JSON数据相关性评分和排名相结合,您可以找到一个成功的组合,具体取决于您的敏捷(故事)或架构(用例)方法.

注意:确实看到了关于上面聚合的类似讨论,但没有看到聚合和相关性评分 - 我对任何重叠的道歉.披露:我不会为弹性工作,并且由于不同的建筑路径而无法在不久的将来从他们出色的工作中受益,除非我做一些与弹性搜索的慈善工作,这不是一个坏主意


Beh*_*shi 6

如果您已经在使用 SOLR,请继续坚持下去。如果您正在起步,请选择弹性搜索。

SOLR 已经修复了最大的主要问题,并且已经相当成熟。

  • 您为什么为新项目推荐 Elastic? (7认同)
  • 我也可以创造新的东西,但仅仅因为我使用新技术或不同的架构,并不意味着它比市场上已有的更好。 (7认同)

Gmu*_*gra 5

想象一下用例:

  1. 大量(100+)个小型(10Mb-100Mb,1000-100000个文档)搜索索引。
  2. 它们被许多应用程序(微服务)使用
  3. 每个应用程序可以使用多个索引
  4. 尺寸索引较小,是的。但是巨大的负载(每秒数百个搜索请求)和请求很复杂(多个聚合,条件等)
  5. 不允许停机
  6. 所有这些都是长达数年的工作,并且不断增长。

每个索引都有单独的ES实例的想法-在这种情况下会产生巨大的开销。

根据我的经验,这种用例对于Elasticsearch的支持非常复杂。

为什么?

第一。

主要问题是根本的后兼容性忽略。

重大更改非常酷!(注意:想象一下SQL服务器,它要求您在所有SQL语句中做一些小的更改,升级后……无法想象。但是对于ES来说,这是正常的)

在下一个主要版本中将弃用的弃用是如此性感!(注意:您知道,Java包含一些已弃用的特性,已有20多年的历史了,但仍然可以在实际的Java版本中使用。)

不仅如此,有时您甚至还可以找到任何地方都没有记载的内容(个人只遇到过一次,但...

所以。如果您想升级ES(因为某些应用程序需要新功能或想要修复错误),那么您将陷入困境。特别是关于主要版本升级时。

客户端API将不会向后兼容。索引设置将不兼容。与ES升级同时升级所有应用程序/服务是不现实的。

但是您必须不时这样做。没有其它的方法。

现有索引是否自动升级?-是的 但是,当您需要更改某些旧索引设置时,它无济于事。

要实现这一目标,您需要不断投入大量精力,以使您的应用程序/服务与ES的未来版本保持向前兼容性。或者,您需要在您的应用程序/服务和ES之间构建(并始终支持)某种中间件,从而为您提供兼容的客户端API。(而且,您不能使用Transport Client(因为每次次要版本的ES升级都需要jar升级),并且这一事实并不能使您的生活更轻松)

它看起来简单又便宜吗?不,这不对。离得很远。持续维护基于ES的复杂基础架构在所有可能的意义上都是昂贵的。

第二。简单的API?好吧...不。当您真正使用复杂的条件和聚合时。...具有5个嵌套级别的JSON请求就可以了,但并不简单。


不幸的是,我没有SOLR的经验,对此无能为力。

但是由于完全兼容SphinxQL,Sphinxsearch在这种情况下要好得多。

注意:Sphinxsearch / Manticore确实很有趣。它不是基于Lucine的,因此存在很大的不同。包含一些ES所没有的独特功能,并通过中小尺寸索引快速抓狂。