弹性搜索索引与关系数据库中的索引有什么区别?

时间:2015-12-31 00:43:31

标签: elasticsearch

似乎在弹性搜索中,您将在集合上定义索引,而在关系数据库中,您将在列上定义索引。如果对整个集合编制索引,为什么需要定义它?

3 个答案:

答案 0 :(得分:8)

“索引”这个词的不幸用法意味着ES和关系数据库中的略有(编辑:非常)不同的东西,因为它们针对不同的用例进行了优化。

数据库中的“索引”是辅助数据结构,它使WHERE个查询和JOIN快速,并且它们通常存储与表中显示的值完全相同的值。您仍然可以拥有未编制索引的列,但WHERE需要full table scan,这对于大型表来说速度很慢。

ES中的“索引”实际上是文档的示意图集合,类似于关系世界中的数据库。您可以在ES中使用不同的“类型”文档,与dbs中的表格非常相似。 ES为您提供了为每个文档的字段定义是否能够检索,搜索或同时搜索两者的灵活性。有关这些选项的一些详细信息,例如here,也与_source字段(提交给ES的原始JSON)相关。

ES使用反向索引来有效地查找匹配文档,但最重要的是,它通常将字符串“规范化”为标记,以便可以执行准确的自由文本搜索。例如,句子可能被分成单个单词,单词被标准化为小写等,因此搜索“荷兰”将匹配文本“2015年荷兰假期”。

如果字段没有倒排索引,则无法对其执行任何搜索(与dbs的全表扫描不同)。有趣的是,你也可以定义字段,以便你可以使用它们进行搜索,但是你无法将它们检索回来,这在磁盘最小化和RAM使用很重要时主要是有益的。

答案 1 :(得分:4)

弹性搜索设计的搜索引擎不太可能是SQL服务器或Mongo DB等主存储的首选。

为什么整个集合都已编入索引?

弹性搜索在内部使用称为倒排索引的结构,该结构存储用于搜索的每个字段(列)值。 如果该字段包含字符串,则会对其进行标记,并执行小写或大写等过滤。

任何方式您都只能找到倒排索引中可用的数据。 因此,默认情况下,弹性搜索会对所有字段执行索引,以使其可供/搜索到您。

https://www.elastic.co/guide/en/elasticsearch/guide/current/inverted-index.html

这与为Relational DB添加索引不同。 在Relational DB中,您可以获得所有可用数据,然后您需要的是索引最常用的列以便更快地查找。 但是,找到包含给定单词的一部分(搜索单词)的所有行的效率变差

答案 2 :(得分:0)

我将参考:

“看来,在弹性搜索中,您会在 收藏”

在Elasticsearch中,索引就像关系世界中的数据库。 索引包含多个文档,就像关系数据库包含表一样。

直到现在,这还是很清楚的。

为了管理大量数据,Elasticsearch(本质上是一个分布式数据库)将每个索引分解为较小的块,称为碎片 Elasticsearch节点。

混乱始于分片是基于Apache Lucene库的数据结构。
Apache Lucene的索引属于一系列索引,称为倒排索引

之所以称为“倒排索引” ,是因为它列出了一个术语以及包含该术语的文档:

Term           Document                 Frequency
Brasil         doc_id_1, doc_id_8       4 (2 in doc_id_1, 2 in doc_id_8)
Argentina      doc_id_1, doc_id_6       3 (2 in doc_id_1, 1 in doc_id_6)

因此,如您在上面看到的那样,此结构存储有关术语的统计信息(频率),以使基于术语的搜索更加高效。

(*)这是自然关系的倒数(Term -> Document),其中文档列出了术语(Document -> Terms)


摘要:

1)Elasticsearch索引:
“索引”一词有两种用法。
一个很安静-索引就像一个数据库。
另一个令人困惑-分片基于名为“倒排索引”的数据结构。

2)关系数据库索引:
与表或视图相关联的结构,可加快从表或视图中检索行的速度。