我知道ElasticSearch是基于Apache Lucene构建的,但我想知道两者之间的重大差异。
答案 0 :(得分:144)
Lucene是 Java库 。 您可以将它包含在项目中,并使用函数调用来引用它的函数。
Elasticsearch是一个基于 JSON 的分布式, Web服务器构建在Lucene上。 虽然Lucene正在做下面的实际工作,但Elasticsearch为我们提供了一个比Lucene更方便的层。在Elasticsearch中创建的每个分片都是一个单独的Lucene实例。 总结一下
答案 1 :(得分:16)
除了 @Vineeth Mohan 文字:
高可用性:Elasticsearch是分布式的,因此它可以管理数据复制,这意味着您的集群中有多个数据副本。这样可以实现高可用性。
强大的查询DSL :Elasticsearch为我们提供了用于在Lucene上读写查询的JSON接口。借助Elasticsearch,您可以编写复杂的查询而无需了解Lucene语法。
无模式(无模式):之前不必定义schema
的字段(名称,值对)。索引数据时,elasticsearch可以像魔术一样在运行时自动创建模式。
答案 2 :(得分:1)
我将从使用角度回答。
Lucene是搜索引擎库。您想使用它来构建自己的搜索引擎:新的Elasticsearch或Solr竞争对手,或者针对您的用例而狭窄的内容(例如,文本分析)。
Elasticsearch是一个搜索引擎。大多数人将其用于日志汇总,产品搜索或这两者的变体(例如社交媒体分析或为某些搜索条件寻找相关人员)。它基于Lucene构建,因此它公开了大部分(尽管不是全部)功能。最重要的是,它还添加了很多内容:
答案 3 :(得分:0)
我将在讨论中添加另一个角度。
Elasticsearch索引是一大堆文档,就像数据库由关系世界中的表组成一样。
为了实现扩展,我们将Elasticsearch索引分散到多个物理节点/服务器中。
为此,我们将Elasticsearch指数分为较小的单位,称为 shards 。
问题:它与Lucene索引有何关系?
如果要搜索特定术语(例如:“ Cake ”或“ Cookie ”),则必须遍历每个碎片并寻找它(让抛开碎片在每个节点上的定位和复制方式。
此操作将花费大量时间-因此我们需要使用高效的数据结构进行搜索-这正是 Lucene索引发挥作用的地方。>
每个 Elasticsearch分片都基于Lucene索引结构,并存储有关术语的统计信息,以提高基于术语的搜索的效率。
(!)这很安静,因为使用了“索引”一词,而Elasticsearch分片是Elasticsearch索引BUT的一部分这一事实基于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)字段是术语的命名序列。