乐闻世界logo
搜索文章和话题

What is the difference between lucene and elasticsearch

7 个月前提问
3 个月前修改
浏览次数118

5个答案

1
2
3
4
5

Lucene 和 Elasticsearch 最主要的区别在于它们分别定位于搜索技术的不同层次。Lucene 是一个开源的全文搜索库,可以用来创建搜索引擎,而 Elasticsearch 是基于 Lucene 构建的,它是一个开源的搜索和分析引擎,提供了分布式多用户能力的全文搜索引擎,附带了 HTTP web 接口和无模式 JSON 文档的处理。

下面是 Lucene 和 Elasticsearch 之间的一些主要区别:

Lucene:

  1. 核心搜索库:Lucene 是一个Java库,它提供了全文搜索功能的底层API。它不是一个完整的搜索引擎,而是帮助开发者构建搜索引擎的工具。

  2. 基础技术:它处理索引创建、查询解析、搜索等核心功能。

  3. 开发复杂性:使用 Lucene 需要对索引结构和搜索算法有深刻理解,它需要开发者写更多的代码来处理数据的索引、查询和搜索结果的排名等。

  4. 分布式能力:Lucene 本身不支持分布式搜索,如果需要实现分布式搜索,开发者需要自行实现。

  5. 接口:Lucene 主要通过 Java API 提供服务,对于非Java环境需要额外的封装或者桥接技术。

Elasticsearch:

  1. 完整的搜索引擎:Elasticsearch 是一个实时的分布式搜索和分析引擎,直接可以用于生产环境。

  2. 基于 Lucene:Elasticsearch 底层利用 Lucene 进行索引和搜索,但提供了简单易用的 RESTful API,开发者可以使用 JSON进行数据索引和查询。

  3. 简化操作:Elasticsearch 简化了复杂的搜索引擎构建过程,提供了现成的解决方案,包括集群管理、数据分析、监控等。

  4. 分布式架构:Elasticsearch 天然支持分布式和扩展,可以轻松处理PB级别的数据。

  5. 多语言客户端:Elasticsearch 提供了多种语言的客户端,方便不同开发环境下的接入和使用。

实例应用:

假设我们要为网站开发一个文章搜索功能:

  • 如果使用 Lucene,我们需要自定义数据模型,建立索引,处理搜索查询,实现排名算法,处理高亮显示等,还需要考虑如何将这些搜索功能集成到网站中。这对开发者的要求很高,因为必须对 Lucene 有深入了解并且能够处理底层的细节。

  • 如果使用 Elasticsearch,我们可以直接通过 HTTP 请求对文章内容进行索引。当用户在搜索框中输入查询时,我们可以发送一个 HTTP 请求到 Elasticsearch,它会处理查询,并返回格式良好的 JSON 结果,其中包括排名高的文档和高亮的搜索词。这大大简化了搜索系统的开发和维护工作。

2024年6月29日 12:07 回复

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、集群管理等。
2024年6月29日 12:07 回复

除了**@Vineeth Mohan 的**话:

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

强大的查询 DSL:Elasticsearch 为我们提供了 JSON 接口,用于在 Lucene 之上读取和写入查询。借助 Elasticsearch,您可以在不了解 Lucene 语法的情况下编写复杂的查询。

**Schemaless (Schema-Free):**字段(名称,值对)不必schema事先定义。当你索引数据时,elasticsearch 可以在运行时自动创建 schema,就像魔术一样。

2024年6月29日 12:07 回复

我将添加另一个角度来进行讨论。

Elasticsearch 索引 VS Lucene 索引。

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

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

问:它和Lucene索引有什么关系?
如果我们想要搜索特定术语(例如:“ Cake ”或“ Cookie ”),我们将必须检查每个分片并查找它(让我们先不考虑分片在每个节点上的定位和复制方式)。

这个操作会花费很多时间——所以我们需要使用一个高效的数据结构来进行这个搜索——这就是Lucene的索引发挥作用的地方。

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

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


Bonus - Lucene 的索引作为倒排索引

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

shell
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) Shard是包含文档的文件目录。
(2) 文档是字段的序列。
(3) 字段是术语的命名序列。

2024年6月29日 12:07 回复

我从使用的角度来回答。

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

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

  • 休息API
  • 查询DSL
  • 分布式系统(分片、复制、集群管理)
  • 方面/聚合
  • 常见用途(例如摄取处理)和管理(用于监控其相关指标、备份和恢复等的 API)的附加功能
2024年6月29日 12:07 回复

你的答案