我知道ElasticSearch是建立在Apache Lucene之上的,但我想了解两者之间的显著区别。
我知道ElasticSearch是建立在Apache Lucene之上的,但我想了解两者之间的显著区别。
Lucene是一个Java库,您可以将其包含在您的项目中并通过函数调用引用它的功能。
Elasticsearch是基于JSON的、分布式的、构建在Lucene之上的Web服务器。虽然实际工作是由Lucene完成的,但Elasticsearch为我们提供了一个方便的层来处理Lucene。在Elasticsearch中创建的每个分片都是一个单独的Lucene实例。因此,总结一下:
除了@Vineeth Mohan的话之外:
高可用性:Elasticsearch是分布式的,因此它可以管理数据复制,这意味着在集群中有多个数据副本。这使得高可用性成为可能。
强大的查询DSL:Elasticsearch为我们提供了JSON接口,用于在Lucene之上读取和编写查询。由于Elasticsearch的存在,您可以编写复杂的查询,而无需了解Lucene语法。
无模式(无架构):schema
字段(名称-值对)不必事先定义。当您索引数据时,elasticsearch可以在运行时自动创建模式,就像魔术一样。
我会在讨论中加入另一个角度。
Elasticsearch索引就像关系型数据库中的表格一样,是一组文档。为了实现扩展性,我们将Elasticsearch索引分布在多个物理节点/服务器上。
为此,我们将Elasticsearch索引分成较小的单元,称为分片。
问题:它如何与Lucene索引相关联?
如果我们要搜索特定的术语(例如:“Cake”或“Cookie”),我们需要查看每个分片并查找它(让我们暂时放置如何定位和复制每个节点上的分片)。
这个操作需要很长时间 - 因此我们需要使用高效的数据结构进行搜索 - 这就是Lucene索引发挥作用的地方。
每个Elasticsearch分片都基于Lucene索引结构并存储有关术语的统计信息,以便使基于术语的搜索更有效率。
(!) 这非常令人困惑,因为有“索引”这个词,而且Elasticsearch分片是Elasticsearch索引的一部分,但是基于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) 字段是命名序列的词条。
从使用的角度来看,我将回答这个问题。
Lucene是一个搜索引擎库。您可以使用它构建自己的搜索引擎:无论是新的 Elasticsearch 或 Solr 竞争对手,还是针对您的用例(例如文本分析)的特定搜索引擎。
Elasticsearch 是一个搜索引擎。大多数人将其用于日志聚合、产品搜索或这两者的变体(例如社交媒体分析或根据某些搜索标准查找相关人员)。它建立在 Lucene 之上,因此它公开了大部分(但不是全部)的功能。它还添加了许多功能,最重要的是: