Lucene和Elasticsearch有什么区别?

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

72649 次浏览

Lucene是一个Java库。 您可以将其包含在项目中,并使用函数调用引用其函数。

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

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

@维尼思·莫汉字外:

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

强大的查询DSL:Elasticsearch为我们提供了一个JSON接口,用于在Lucene上读写查询。由于有了Elasticsearch,您可以在不了解Lucene语法的情况下编写复杂的查询。

不必事先定义schema无架构(无架构):字段(名称、值对)。当你索引数据时,Elasticsearch可以在运行时自动创建模式,就像魔术一样。

我将从使用的角度来回答。

Lucene是一个搜索引擎图书馆。你会想用它来构建你自己的搜索引擎:要么是一个新的ElasticSearch或Solr的竞争对手,要么是适合你的用例的东西(例如文本分析)。

Elasticsearch是ABC_0的_。大多数人将其用于日志聚合、产品搜索或这两者的变体(例如,社交媒体分析或查找某些搜索条件的相关人员)。它构建在Lucene之上,因此公开其大部分(尽管不是全部)功能。它还在顶部添加了很多内容,最重要的是:

  • REST API
  • 查询DSL
  • 分布式系统(分片、复制、集群管理)
  • 面/聚合
  • 其他常用功能(如摄取处理)和管理功能(用于监控其相关指标、备份和恢复等的API)

我将从另一个角度进行讨论。

Elasticsearch索引与Lucene索引。

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

为此,我们将ElasticSearch索引分解为更小的单元,称为碎片

问:它与Lucene索引有什么关系?
如果我们要搜索特定术语(例如:“蛋糕 ”)或者";曲奇饼";)我们必须检查每个碎片并查找它(让我们暂且不谈如何在每个节点上定位和复制碎片)。

此操作将花费大量时间-因此我们需要使用用于此搜索的高效数据结构-这就是Lucene的索引发挥作用的地方。

每个Elasticsearch Shard基于Lucene索引结构,并存储关于术语的统计信息,以便使基于术语的搜索更有效。

(!)由于“索引”这个词,这是相当令人困惑的。以及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的索引属于称为倒排索引的索引家族。这是因为对于一个术语,它可以列出包含该术语的文档。
这与自然关系相反,在自然关系中,文档列出术语。


(提醒)我们是如何从一个碎片到一个术语的?

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