弹性搜索索引和关系数据库中的索引有什么区别?
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= 中显示的值完全相同的值].你仍然可以有没有索引的列,但是 WHERE
s 需要一个 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 或视图检索行。
似乎在弹性搜索中您会在集合上定义索引,而在关系数据库中您会在列上定义索引。如果整个集合都被索引了,为什么还需要定义?
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= 中显示的值完全相同的值].你仍然可以有没有索引的列,但是 WHERE
s 需要一个 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 或视图检索行。