一文带你了解Elasticsearch vs. Solr

开源
本文,我们将比较业界两个最流行的开源搜索引擎,Solr和ElasticSearch。

背景

当前是云计算和数据快速增长的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求。随着数据的堆积,如何快速有效地搜索这些数据,成为对后端服务的挑战。本文,我们将比较业界两个最流行的开源搜索引擎,Solr和ElasticSearch。两者都建立在Apache Lucene开源平台之上,它们的主要功能非常相似,但是在部署的易用性,可扩展性和其他功能方面也存在巨大差异。

Elastcisearch

介绍

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch 以其易用性迅速赢得了许多用户,被用在网站搜索、日志分析等诸多方面。由于 ES 强大的横向扩展能力,甚至很多人也会直接把 ES 当做 NoSQL 来用。

特性

  • 搜索引擎:通过 Elasticsearch,您能够执行及合并多种类型的搜索(结构化数据、非结构化数据、地理位置、指标),搜索方式随心而变
  • 分析引擎:对的是十亿行日志,Elasticsearch 聚合让您能够从大处着眼,探索数据的趋势和规律
  • 检索性能:通过有限状态转换器实现了用于全文检索的倒排索引,实现了用于存储数值数据和地理位置数据的 BKD 树,以及用于分析的列存储
  • 可扩展性:能够水平扩展,每秒钟可处理海量事件,同时能够自动管理索引和查询在集群中的分布方式,以实现极其流畅的操作
  • 检索能力:基于各项元素(从词频或新近度到热门度等)对搜索结果进行排序。将这些内容与功能进行混搭,以优化向用户显示结果的方式
  • 数据容错:通过跨集群复制功能,辅助集群可以作为热备份随时投入使用。
  • 实时互动:在 Kibana 中通过炫酷的可视化来探索您的数据,从华夫饼图到热点图,再到时序数据分析,应有尽有

数据结构

  • index(索引):索引是文档(Document)的容器,是一类文档的集合,类比传统的关系型数据库来说,索引相当于SQL中的一个数据库(Database)
  • Type(类型):从 6.0.0开始单个索引只能有一个类型,7.0.0以后将不建议使用,8.0.0以后完全不支持
  • Document(文档):Document Index 里面单条的记录成为Document(文档)。等同于关系型数据库表中的行
  • Field(字段):属性Fieldl类似于关系型数据库的字段的概念,一样的,每个属性有自己不同的类型,类型包括核心类型、复杂类型(对象类型[object]和嵌套类型[nested])、地理类型以及特殊类型

集群

Elasticsearch 可以横向扩展至数百(甚至数千)的服务器节点,同时可以处理PB级数据。ElasticSearch 的主旨是随时可用和按需扩容。 而扩容可以通过购买性能更强大( 垂直扩容 ,或 纵向扩容 ) 或者数量更多的服务器( 水平扩容 ,或 横向扩容 )来实现。虽然 Elasticsearch 可以获益于更强大的硬件设备,但是垂直扩容是有极限的。 真正的扩容能力是来自于水平扩容—为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中。对于大多数的数据库而言,通常需要对应用程序进行非常大的改动,才能利用上横向扩容的新增资源。与之相反的是,ElastiSearch天生就是 分布式的 ,它知道如何通过管理多节点来提高扩容性和可用性。 这也意味着你的应用无需关注这个问题 。

集群支持如下功能:

  • 集群健康
  • 故障转移
  • 水平扩容
  • 应对故障

Solr

介绍

Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。Apache Solr 是一个成熟的项目,于 2006 年首次发布到开源,Solr 在搜索领域占据了多年的主导地位。然后,在 2010 年左右,Elasticsearch 成为市场上的另一种选择。

特点

  • RESTful API: 要与Solr通信,可以使用RESTful服务与Solr通信,可以使用XML,JSON,CSV等格式的文件作为输入文档,并以相同的文件格式获取结果
  • 全文搜索: Solr提供了全文搜索所需的所有功能:令牌,短语,拼写检查,通配符,自动完成
  • 企业准备: 根据企业或组织的需要,Solr可以部署在任何类型的系统:独立,分布式,云
  • 灵活可扩展: 通过扩展Java类并进行相关配置,可以定制Solr组件
  • NoSQL数据库: Solr可以用作大数量级的NoSQL数据库,可以沿着集群分布搜索任务

架构

Apache Solr的主要构建块(组件)

  • 请求处理程序 - 发送到Apache Solr的请求由这些请求处理程序处理。请求可以是查询请求或索引更新请求。根据这些请示的要求来选择请求处理程序。为了将请求传递给Solr,通常将处理器映射到某个URI端点,并且它将为指定的请求提供服务。
  • 搜索组件 - 搜索组件是Apache Solr中提供的搜索类型(功能)。它可能是拼写检查,查询,构面,命中突出显示等。这些搜索组件被注册为搜索处理程序。多个组件可以注册到搜索处理程序。
  • 查询解析器 − Apache Solr查询解析器解析传递给Solr的查询,并验证查询的语法是否有错误。解析查询后,将它们转换为Lucene理解的格式。
  • 响应写入器 - Apache Solr中的响应写入器是为用户查询生成格式化输出的组件。 Solr支持XML,JSON,CSV等响应格式。对每种类型的响应都有不同的响应写入。
  • 分析器/分词器 - Lucene以令牌的形式识别数据。 Apache Solr分析内容,将其分成令牌,并将这些令牌传递给Lucene。 Apache Solr中的分析器检查字段的文本并生成令牌流。分词器将分析器准备的令牌流分解成令牌。
  • 更新请求处理器 - 每当向Apache Solr发送更新请求时,请求都通过一组称为更新请求处理器的插件(签名,日志记录,索引)运行。这个处理器负责修改,例如删除字段,添加字段等。

总结

Solr专注于文本搜索,而Elasticsearch则常用于查询、过滤和分组分析统计。那么,到底是选择 Solr 还是 Elasticsearch?有时很难找到明确的答案。无论选择 Solr 还是 Elasticsearch,首先需要了解正确的用例和未来需求,总结它们的每个属性。

  • 如果需要分布式索引,则需要选择 Elasticsearch。对于需要良好可伸缩性和性能的云和分布式环境,Elasticsearch 是更好的选择。
  • 在Solr中,索引间进行join必须是单个分片和其他节点上的副本集进行关联来搜索文档间关系(例如SQL连接)。而Elasticsearch提供更高效的has_children和top_children查询来检索这样的相关文档。
  • 两者都有很好的操作工具,尽管 Elasticsearch 因其易于使用的 API 而更多地吸引了 DevOps 人群,因此可以围绕它创建一个更加生动的工具生态系统。
  • Elasticsearch 在开源日志管理用例中占据主导地位,许多组织在 Elasticsearch 中索引它们的日志以使其可搜索。虽然 Solr 现在也可以用于此目的,但它只是错过了这一想法。
  • Solr 仍然更加面向文本搜索。另一方面,Elasticsearch 通常用于过滤和分组,分析查询工作负载,而不一定是文本搜索。
  • Elasticsearch 开发人员在 Lucene 和 Elasticsearch 级别上投入了大量精力使此类查询更高效(降低内存占用和 CPU 使用)。因此,对于不仅需要进行文本搜索,而且需要复杂的搜索时间聚合的应用程序,Elasticsearch 是一个更好的选择。
  • Elasticsearch 更容易上手,一个下载和一个命令就可以启动一切。Solr 传统上需要更多的工作和知识,但 Solr 最近在消除这一点上取得了巨大的进步,现在只需努力改变它的声誉。
  • 从操作上讲,Elasticsearch 使用起来比较简单,它只有一个进程。Solr 在其类似 Elasticsearch 的完全分布式部署模式 SolrCloud 中依赖于 Apache ZooKeeper,ZooKeeper 是超级成熟,超级广泛使用等等,但它仍然是另一个活跃的部分。虽然 Elasticsearch 内置了类似 ZooKeeper 的组件 Xen,但 ZooKeeper 可以更好地防止有时在 Elasticsearch 集群中出现的可怕的裂脑问题。
  • Solr接受来自不同来源的数据,包括XML文件,逗号分隔符(CSV)文件和从数据库中的表提取的数据以及常见的文件格式(如Microsoft Word和PDF)。Elasticsearch还支持其他来源的数据,例如Git,JDBC,JMS,Kafka,LDAP,MongoDB等。还有各种插件可用。
责任编辑:姜华 来源: 今日头条
相关推荐

2023-11-20 08:18:49

Netty服务器

2023-11-06 08:16:19

APM系统运维

2022-11-11 19:09:13

架构

2022-02-23 09:36:11

GoRuby编程语言

2022-02-17 08:35:59

OLTPOLAP数据仓库

2023-11-08 08:15:48

服务监控Zipkin

2023-10-27 08:15:45

2022-02-24 07:34:10

SSL协议加密

2020-02-02 15:14:24

HTTP黑科技前端

2020-10-08 14:32:57

大数据工具技术

2022-04-28 09:22:46

Vue灰度发布代码

2022-09-29 13:09:38

DataClassPython代码

2022-02-22 08:15:59

微服务架构单体架构

2019-07-04 15:16:52

数据挖掘大数据算法

2023-03-31 08:16:53

Flutter优化内存管理

2022-09-06 11:21:49

光网络光纤

2023-12-06 16:28:56

2018-10-22 08:14:04

2024-05-07 08:49:36

Hadoop数据存储-分布式存储

2024-05-27 00:00:00

.NET游戏引擎C#
点赞
收藏

51CTO技术栈公众号