Lucene 和 Elasticsearch 有什么区别

What is the difference between Lucene and Elasticsearch

我知道 ElasticSearch 是基于 Apache Lucene 构建的,但我想知道两者之间的显着差异。

Lucene 是一个 Java 库。 您可以将它包含在您的项目中并使用函数调用来引用它的功能。

Elasticsearch 是基于JSON分布式网络服务器构建的在 Lucene 之上。 虽然是 Lucene 在做底层的实际工作,但 Elasticsearch 为我们提供了一个方便的 Lucene 层。在 Elasticsearch 中创建的每个分片都是一个单独的 Lucene 实例。 所以总结

  1. Elasticsearch 构建于 Lucene 之上,并提供基于 JSON 的 REST API 来引用 Lucene 功能.
  2. Elasticsearch 在 Lucene 之上提供了一个 分布式系统。分布式系统不是 Lucene 知道或构建的东西。 Elasticsearch 提供了这种分布式结构的抽象。
  3. Elasticsearch 提供其他支持功能,如线程池、队列、node/cluster 监控 API、数据监控 API、集群管理等

除了@Vineeth Mohan的话:

高可用性: Elasticsearch 是分布式的,因此它可以管理数据复制,这意味着您的集群中有多个数据副本。这实现了高可用性。

强大的查询 DSL:Elasticsearch 为我们提供了 JSON 接口,用于在 Lucene 之上读写查询。感谢 Elasticsearch,您可以在不知道 Lucene 语法的情况下编写复杂的查询。

Schemaless(无模式): schema 的字段(名称,值对)之前不必定义。当你索引数据时,elasticsearch 可以在运行时自动创建模式,就像魔术一样。

我会从使用的角度来回答

Lucene 是一个搜索引擎。您希望使用它来构建您自己的搜索引擎:新的 Elasticsearch 或 Solr 竞争者或适合您的用例的东西(例如文本分析)。

Elasticsearch 是一个搜索引擎。大多数人将其用于日志聚合、产品搜索或这两者的变体(例如社交媒体分析或为某些搜索条件寻找相关人员)。它建立在 Lucene 之上,因此 展示了它的大部分(虽然不是全部)功能 。它还增加了很多,最重要的是:

  • 休息 API
  • 查询 DSL
  • 分布式系统(分片、复制、集群管理)
  • 面/aggregations
  • 常用的附加功能(例如ingest processing) and management (APIs for monitoring its relevant metrics、备份和恢复等)

我会从另一个角度来讨论。

Elasticsearch 索引与 Lucene 索引。

Elasticsearch 索引 是一大堆文档,就像数据库由关系世界中的表组成一样。
为了实现扩展,我们将 Elasticsearch 索引分布到多个物理节点/服务器中。

为此,我们将 Elasticsearch 索引分成更小的单元,称为 分片

问题:与Lucene索引有什么关系?
如果我们想搜索一个特定的术语(例如:“Cake”或“Cookie”),我们必须遍历每个分片并寻找它(暂且不谈分片是如何在每个节点上定位和复制的)。

这个操作会花费很多时间 - 所以我们需要使用一个有效的数据结构来进行这个搜索 - 这是Lucene的索引[=52] =]开始发挥作用。

每个 Elasticsearch 分片都基于 Lucene 索引结构 并存储有关术语的统计信息,以提高 term-based 搜索效率。

(!) 这非常令人困惑,因为“索引”这个词以及 Elasticsearch 分片是 Elasticsearch 索引的一部分但基于 Lucene 索引的数据结构这一事实。


奖励 - Lucene 的索引作为倒排索引

从下面的例子中可以看出,Lucene的索引存储了原始文档的内容以及附加信息,例如术语词典和术语频率,这些信息 提高搜索效率:

Term           Document                 Frequency
Cake           doc_id_1, doc_id_8       4 (2 in doc_id_1, 2 in doc_id_8)
Cookie         doc_id_1, doc_id_6       3 (2 in doc_id_1, 1 in doc_id_6)
Spaghetti      doc_id_12                1 (1 in doc_id_12)

Lucene 的索引属于称为倒排索引的索引系列。这是因为它可以为一个术语列出包含它的文档。
这与自然关系相反,在自然关系中文档列出术语。


(提醒)我们是如何从 Shard 到 term 的?

(1) Shard 是包含文档的文件目录。
(2) 文档是一系列字段。
(3) 字段是术语的命名序列。