倒排索引
ElasticSearch之所以搜索这么快速,归功于他的倒排索引的设计。
从上图可以看出,词对应的doc,但是并不知道每一个doc中的内容,那么如果想要排序的话每一个doc都去获取一次文档内容非常耗时。Doc Values的出现使得这个问题迎刃而解。
Doc Values
倒排索引将词项映射到包含它们的文档,doc values 将文档映射到它们包含的词项:
当数据被转置之后,想要收集到 Doc_1 和 Doc_2 的唯一 token 会非常容易。
Doc Values使用
Doc Values 是在索引时与倒排索引同时生成。默认情况下每个字段的 Doc Values 都是激活的,除了 analyzed strings。也就是说 Doc Values 和倒排索引一样,基于 Segement 生成并且是不可变的。同时 Doc Values 和倒排索引一样序列化到磁盘,这样对性能和扩展性有很大帮助。
Doc Values 通过序列化把数据结构持久化到磁盘,我们可以充分利用操作系统的内存,而不是 JVM 的 Heap 。 当 working set 远小于系统的可用内存,系统会自动将 Doc Values 保存在内存中,使得其读写十分高速; 不过,当其远大于可用内存时,操作系统会自动把 Doc Values 写入磁盘。很显然,这样性能会比在内存中差很多,但是它的大小就不再局限于服务器的内存了。
Elasticsearch 中的 Doc Values 常被应用到以下场景:
- 对一个字段进行排序
- 对一个字段进行聚合
- 某些过滤,比如地理位置过滤
- 某些与字段相关的脚本计算
Doc Values缺点是需要额外的空间来保存,如果你存储的数据确实不需要这个特性,就不如禁用他,这样不仅节省磁盘空间,也许会提升索引的速度。在字段的映射(mapping)设置 doc_values: false 即可。