我知道Elasticsearch是基于Apache Lucene构建的,但我想知道两者之间的显著差异。
Lucene是一个Java库。 您可以将其包含在项目中,并使用函数调用引用其函数。
Elasticsearch是基于Lucene的JSON,分布式的,网络服务器。 虽然Lucene在下面做实际的工作,但Elasticsearch为我们提供了Lucene之上的一个方便的层。在Elasticsearch中创建的每个碎片都是一个单独的Lucene实例。 所以总结一下
除@维尼思·莫汉字外:
高可用性: Elasticsearch是分布式的,因此它可以管理数据复制,这意味着在您的集群中有多个数据副本。这样可以实现高可用性。
强大的查询DSL:Elasticsearch为我们提供了一个JSON接口,用于在Lucene上读写查询。由于有了Elasticsearch,您可以在不了解Lucene语法的情况下编写复杂的查询。
不必事先定义schema的无架构(无架构):字段(名称、值对)。当你索引数据时,Elasticsearch可以在运行时自动创建模式,就像魔术一样。
schema
我将从使用的角度来回答。
Lucene是一个搜索引擎图书馆。你会想用它来构建你自己的搜索引擎:要么是一个新的ElasticSearch或Solr的竞争对手,要么是适合你的用例的东西(例如文本分析)。
Elasticsearch是ABC_0的_。大多数人将其用于日志聚合、产品搜索或这两者的变体(例如,社交媒体分析或查找某些搜索条件的相关人员)。它构建在Lucene之上,因此公开其大部分(尽管不是全部)功能。它还在顶部添加了很多内容,最重要的是:
我将从另一个角度进行讨论。
弹性搜索索引是一大块文档,就像关系世界中由表组成的数据库一样。为了实现扩展,我们将ElasticSearch索引扩展到多个物理节点/服务器中。
为此,我们将ElasticSearch索引分解为更小的单元,称为碎片。
问:它与Lucene索引有什么关系? 如果我们要搜索特定术语(例如:“蛋糕 ”)或者";曲奇饼";)我们必须检查每个碎片并查找它(让我们暂且不谈如何在每个节点上定位和复制碎片)。
此操作将花费大量时间-因此我们需要使用用于此搜索的高效数据结构-这就是Lucene的索引发挥作用的地方。
每个Elasticsearch Shard基于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)字段是术语的命名序列。