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

What is the difference between an elastic search index and an index in a relational database?

似乎在弹性搜索中您会在集合上定义索引,而在关系数据库中您会在列上定义索引。如果整个集合都被索引了,为什么还需要定义?

Elastic 搜索在设计上是一种搜索引擎,不太可能成为 SQL 服务器或 Mongo 数据库等主存储的首选

为什么要对整个集合进行索引?

Elastic search 内部使用了一种称为倒排索引的结构,它存储每个字段(列)的值以供搜索。 如果该字段包含字符串,它将对其进行标记,并执行小写或大写等过滤。

任何方式都只能找到倒排索引中可用的数据。 因此,默认情况下,elastic search 会为所有字段执行索引,以便为您提供 available/searchable。

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

这与为关系数据库添加索引不同。 在关系数据库中,您拥有所有可用数据,然后您需要为最常用的列建立索引以便更快地查找。 但是查找包含给定单词一部分的所有行的效率较低(搜索单词)

不幸的是,"index" 这个词的用法在 ES 和关系数据库中略有不同(编辑:非常),因为它们针对不同的用例进行了优化。

数据库中的 "index" 是一种辅助数据结构,它使 WHERE 查询和 JOIN 快速,并且它们通常存储与 [=35= 中显示的值完全相同的值].你仍然可以有没有索引的列,但是 WHEREs 需要一个 full table scan,它在大 tables 上很慢。

ES中的一个"index"其实就是一个文档的示意图集合,类似于关系世界中的数据库。您可以在 ES 中拥有不同的 "types" 文档,这与 dbs 中的 tables 非常相似。 ES 使您可以灵活地为每个文档的字段定义您是否希望能够检索它、通过它进行搜索或两者兼而有之。有关这些选项的一些详细信息可以从例如 here 中找到,也与 _source 字段相关(提交给 ES 的原始 JSON)。

ES 使用倒排索引有效地查找匹配的文档,但最重要的是,它通常将 "normalizes" 字符串转换为标记,以便可以执行准确的 free-text 搜索。例如,句子可能会被拆分成单独的单词,单词被标准化为小写等,以便搜索 "holland" 将匹配文本 "Vacation at Holland 2015".

如果一个字段没有倒排索引,您将无法对其执行任何搜索(与 dbs 的完整 table 扫描不同)。有趣的是,您还可以定义字段,以便您可以使用它们进行搜索,但您无法将它们取回,这主要是在磁盘和 RAM 使用量最小化很重要时有益。

我会参考:

"It seems that in elastic search you would define an index on a collection"

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

到现在,已经很清楚了。

为了管理大量数据,Elasticsearch(本质上是分布式数据库)将每个 index 分成更小的块,称为 shards 分布在 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-based 搜索更有效率。

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


总结:

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

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