本文的目的在于介绍关于ElasticSearch内部的一些运行情况。在这里我们先不介绍新的知识点, 数据字段是我们要经常查阅的内容之一,但我们使用的时候不必太在意。
当你对一个字段进行排序时,ElasticSearch 需要进入每个匹配到的文档得到相关的值。 倒排索引在用于搜索时是非常卓越的,但却不是理想的排序结构。
a.当搜索的时候,我们需要用检索词去遍历所有的文档。
b.当排序的时候,我们需要遍历文档中所有的值,我们需要做反倒序排列操作。
为了提高排序效率,ElasticSearch 会将所有字段的值加载到内存中,这就叫做"数据字段"。
注:ElasticSearch将所有字段数据加载到内存中并不是匹配到的那部分数据。 而是索引下所有文档中的值,包括所有类型。
将所有字段数据加载到内存中是因为从硬盘反向倒排索引是非常缓慢的。尽管你这次请求需要的是某些文档中的部分数据, 但你下个请求却需要另外的数据,所以将所有字段数据一次性加载到内存中是十分必要的。
ElasticSearch中的字段数据常被应用到以下场景:
a.对一个字段进行排序
b.对一个字段进行聚合
c.某些过滤,比如地理位置过滤
d.某些与字段相关的脚本计算
毫无疑问,这会消耗掉很多内存,尤其是大量的字符串数据 -- string字段可能包含很多不同的值,比如邮件内容。 值得庆幸的是,内存不足是可以通过横向扩展解决的,我们可以增加更多的节点到集群。