57.fielddata预加载机制以及序号标记预加载

时间:2023-02-10 09:59:35

如果真的要对分词的field执行聚合,那么每次都在query-time的同时由es生成fielddata并加载到内存中来,速度可能会比较慢,性能很差,改善性能的方式就是预先生成fielddata值并加载到内存中去。

一、fielddata预加载

POST /test_index/_mapping/test_type

{

"properties": {

"test_field": {

"type": "string",

"fielddata": {

"loading" : "eager"

}

}

}

}

这样就把fielddata的生成从query-time变为index-time,在建立倒排索引的时候,会同步生成fielddata并且加载到内存中来,这样的话,对分词field的聚合性能当然会大幅度增强。

二、序号标记预加载

在一些doc中会有很多重复值,es在加载到内存时不会完全加载这些重复的值,只会加载一些序号标记,这样就可以大幅度的减少内存的使用。比如有如下四个doc,值分别对应:

  • doc1: status1
  • doc2: status2
  • doc3: status2
  • doc4: status1

在有很多重复值的情况,es会进行global ordinal标记

  • status1 标记为 0
  • status2 标记为 1

这样这四个doc所对应的标记就是:

  • doc1: 0
  • doc2: 1
  • doc3: 1
  • doc4: 0

建立的fielddata也会是这个样子的,这样的好处就是减少重复字符串的出现的次数,减少内存的消耗

POST /test_index/_mapping/test_type

{

"properties": {

"test_field": {

"type": "string",

"fielddata": {

"loading" : "eager_global_ordinals"

}

}

}

}