本章的最后一个话题时关于Elasticsearch内部的一些运行情况。在这里我们先不介绍新的知识点,所以我们应该意识到,Doc Values是我们需要反复提到的一个重要话题。

    当你对一个字段进行排序时,Elasticsearch 需要访问每个匹配到的文档得到相关的值。倒排索引的检索性能是非常快的,但是在字段值排序时却不是理想的结构。

    1. 在搜索的时候,我们能通过搜索关键词快速得到结果集
    2. 当排序的时候,我们需要倒排索引里面某个字段值的集合。换句话说,我们需要转置 倒排索引。

    转置 结构在其他系统中经常被称作 列存储。实质上,他将所有单字段的值存储在单数据列中,这使得对其进行操作是十分高效的,例如排序。

    在Elasticsearch中,Doc Values就是一种列式存储结构,默认情况下每个字段的Doc Values 都是激活的,Doc Values是在索引时创建的,当字段索引时,Elasticsearch为了能够快速检索,会把字段的值加入倒排索引中,同时他也会存储该字段的Doc Values。

    Elasticsearch 中的Doc Values常被应用到以下场景:

    1. 对一个字段进行排序
    2. 对一个字段进行聚合
    3. 某些过滤,比如地理位置过滤
    4. 某些与字段相关的脚本计算

    因为文档值被序列化到磁盘,我们可以依靠操作系统的帮助来快速访问。当working set 远小于节点的可用内存,系统会自动将所有的文档值保存在内存中,使得其读写十分高速;当1其远大于可用内存,操作系统会自动把Doc Values 加载到系统的页缓存中,从而避免了jvm 堆内存溢出异常。

    我们稍后会深入讨论Doc Values。现在所有你需要知道的是排序发生在索引时建立的平型数据结构中。