elasticsearch - Elasticsearch 索引和关系数据库中的索引有什么区别?

标签 elasticsearch indexing relational-database

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

最佳答案

不幸的是,“索引”一词在 ES 和关系数据库中的含义略有不同(编辑:非常)不同,因为它们针对不同的用例进行了优化。

数据库中的“索引”是一种二级数据结构,它使 WHERE 查询和 JOIN 速度更快,并且它们通常存储与表中显示的值完全相同的值。您仍然可以拥有未编入索引的列,但是 WHERE 需要 full table scan这在大 table 上很慢。

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

ES 使用倒排索引有效地查找匹配的文档,但最重要的是,它通常将字符串“规范化”为标记,以便可以执行准确的自由文本搜索。例如,句子可能会被拆分成单独的单词,单词被规范化为小写等,这样搜索“holland”就会匹配文本“Vacation at Holland 2015”。

如果一个字段没有倒排索引,你就不能对其进行任何搜索(不像dbs的全表扫描)。有趣的是,您还可以定义字段,这样您就可以使用它们进行搜索,但您无法将它们取回,这在磁盘和 RAM 使用量最小化很重要时非常有用。

关于elasticsearch - Elasticsearch 索引和关系数据库中的索引有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539476/

相关文章:

elasticsearch - 如何在Elasticsearch中的字符串列表中搜索?

json - 如何在 fluentd 中拖尾多个文件

MySQL 索引键

mysql - MySQL 是存储日志的正确选择吗?

mysql - 无法找出关联两个表的 SQL 查询

mysql - 我的 SQL 在一周内抓取最后一个活跃用户

elasticsearch - 有什么简单的方法可以通过logstash将数据推送到elasticsearch

elasticsearch - 使用Elasticsearch构建报告后端:是否可以查询?

python - 弹出索引超出范围

mysql - 做 "small_table LEFT JOIN large_table"是不好的做法吗?