Lucene和Elasticsearch有什么区别

时间:2015-01-06 07:05:03

标签: elasticsearch lucene

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

4 个答案:

答案 0 :(得分:144)

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

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

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

答案 1 :(得分:16)

除了 @Vineeth Mohan 文字:

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

强大的查询DSL :Elasticsearch为我们提供了用于在Lucene上读写查询的JSON接口。借助Elasticsearch,您可以编写复杂的查询而无需了解Lucene语法。

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

答案 2 :(得分:1)

我将从使用角度回答。

Lucene是搜索引擎。您想使用它来构建自己的搜索引擎:新的Elasticsearch或Solr竞争对手,或者针对您的用例而狭窄的内容(例如,文本分析)。

Elasticsearch是一个搜索引擎。大多数人将其用于日志汇总,产品搜索或这两者的变体(例如社交媒体分析或为某些搜索条件寻找相关人员)。它基于Lucene构建,因此它公开了大部分(尽管不是全部)功能。最重要的是,它还添加了很多内容:

  • REST API
  • 查询DSL
  • 分布式系统(分片,复制,集群管理)
  • facets / aggregations
  • 常用功能(例如ingest处理)和管理(用于监视其relevant metrics,备份和还原等的API)的其他功能

答案 3 :(得分:0)

我将在讨论中添加另一个角度。

Elasticsearch指数与Lucene指数。

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

为此,我们将Elasticsearch指数分为较小的单位,称为 shards

问题:它与Lucene索引有何关系?
如果要搜索特定术语(例如:“ Cake ”或“ Cookie ”),则必须遍历每个碎片并寻找它(让抛开碎片在每个节点上的定位和复制方式。

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

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

(!)这很安静,因为使用了“索引”一词,而Elasticsearch分片是Elasticsearch索引BUT的一部分这一事实基于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)字段是术语的命名序列。