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

Mus*_*ore 6 elasticsearch

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

Nik*_*yrh 10

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

数据库中的"索引"是一种辅助数据结构,它使WHERE查询JOIN快速,并且它们通常存储与表中显示的值完全相同的值.您仍然可以拥有未编制索引的列,但是然后WHERE需要进行全表扫描,这对大型表来说很慢.

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

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

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

  • 我认为这是错误的:“ES中的‘索引’实际上是文档的示意性集合,类似于关系世界中的数据库。”,根据elasticsearch中的文档索引就像sql世界中的表:https:// www.elastic.co/guide/en/elasticsearch/reference/current/_mapping_concepts_across_sql_and_elasticsearch.html (3认同)

LMK*_*LMK 7

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

为什么整个集合都被索引?

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

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

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

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