ElasticSearch中的field data(正排索引)

主要参考文章:http://www.tuicool.com/articles/B3QnQzE

正排索引与倒排索引
Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。倒排索引的结构如下图,它存储的内容是“哪些词语出现在了哪些文档中”,这种结构决定了它不能很好的支持对文档的索引、排序、聚合的操作,因此Elasticsearch中增加了field data的数据结构。



Elasticsearch cluster中的内存多半都被消耗在了field data(也就是我们常说的正排索引)上,field data主要用于:
·按照字段排序(sort)
·按照字段进行聚合(Aggregations)
·过滤器,例如地理位置过滤
·script排序中使用到某些字段

field data(正排索引)的结构是“哪些文档中包含哪些词语”。形式如下图:

field data是以段(segment)为单位进行构建的,当一个新的段打开时,老的field data仍然有效,只有和新段相对应的field data会被载入到内存。


正排索引的内存使用
将field data都载入堆内存可以提高访问速度,但是载入过多数据到内存中会引起频繁GC甚至是OutOfMemory异常。
field data默认是懒加载模式,在遇到query之后才开始将倒排索引正排化,它不仅仅在内存中载入命中的文档,而是会载入索引中所有文档的field data,为了以后的查询做准备。


优化内存
1、过滤field data,告诉ES在哪些term不要在field data中载入。
下图是按照频率过滤,也可以按照正则表达式过滤。

2、设置预先加载field data
1) Eagerly load fielddata
2) Eagerly load global ordinals
3) Prepopulate caches with warmers
具体设置参考:http://zhaoyanblog.com/archives/764.html


3、DocValues
field data可以被写在磁盘中,实现这种操作的选项叫做 doc values。
doc values允许你使用大量的field data数据而不必担心内存被大量占用的问题。当你使用doc values后,你的堆内存就可以分配更小的值来加快垃圾回收的速度。
doc values是在索引阶段就创建的,它的预创建使得它的初始化更加容易。
doc values适用于numeric, date, Boolean, binary, geo-point字段,还有"not_analyzed"的string字段。




补充:
field data的格式
按字段的类型的不同,字段对应的doc values的类型可以有不同:

1.String字段
paged_bytes (默认格式): 不同的term顺序地存储在一个大的buffer中,每个文档被映射到它所包含的term在buffter中的索引。
fst:term以FST (finite state transducer)格式存储,载入慢一些,但是在很多term有相同的前缀或者后缀的情况下能够减少内存的使用。
doc_values:索引建立时计算field data并将它存储在磁盘上,占用的内存最少,但是对应的字段必须是not_analyzed。

2.Numeric字段
array (默认格式):field data在内存中以数组的形式存储。
doc_values:索引建立时计算field data并将它存储在磁盘上,占用的内存最少。

3.Geo字段
array (default):经度和维度在内存中以数组的形式存储。
doc_values:索引建立时计算field data并将它存储在磁盘上,占用的内存最少。

没有更多推荐了,返回首页