似乎在弹性搜索中,您将在集合上定义索引,而在关系数据库中,您将在列上定义索引.如果对整个集合编制索引,为什么需要定义它?
不幸地使用了"索引"这个词,这意味着在ES和关系数据库中略微(编辑:非常)不同的东西,因为它们针对不同的用例进行了优化.
数据库中的"索引"是一种辅助数据结构,它使WHERE
查询JOIN
快速,并且它们通常存储与表中显示的值完全相同的值.您仍然可以拥有未编制索引的列,但是然后WHERE
需要进行全表扫描,这对大型表来说很慢.
ES中的"索引"实际上是文档的示意图集合,类似于关系世界中的数据库.您可以在ES中使用不同的"类型"文档,与dbs中的表格非常相似.ES为您提供了为每个文档的字段定义是否能够检索,搜索或同时搜索两者的灵活性.关于这些选项的一些细节可以在这里找到,也可以在_source
字段(提交给ES的原始JSON)中找到.
ES使用反向索引来有效地查找匹配文档,但最重要的是,它通常将字符串"规范化"为标记,以便可以执行准确的自由文本搜索.例如,句子可能被分成单个单词,单词被标准化为小写等,因此搜索"荷兰"将匹配文本"2015年荷兰假期".
如果字段没有倒排索引,则无法对其执行任何搜索(与dbs的全表扫描不同).有趣的是,你也可以定义字段,以便你可以使用它们进行搜索,但是你无法将它们检索回来,在最小化磁盘和RAM使用很重要时,这主要是有益的.