Eager global ordinals(急切全局序号)

eager_global_ordinals 映射参数控制何时为字段构建全局序号。启用时,全局序号会在索引刷新期间计算,而不是在查询执行期间“懒加载”。这可以提高依赖全局序号的操作的性能,例如对关键字字段进行排序和聚合。然而,它也可能增加索引刷新时间和内存使用量。

全局序号表示从词项值到整数标识符的映射,内部用于快速执行聚合和排序操作。通过“急切地”加载它们,系统以索引期间额外的前期处理为代价,减少了查询延迟。

默认情况下,eager_global_ordinals 是禁用的,这确保了集群针对索引速度进行了优化。

全局序号存储在字段数据缓存中,并消耗堆内存。具有高基数的字段可能会消耗大量堆内存。为了防止与内存相关的问题,仔细配置字段数据断路器设置非常重要。

何时使用全局序号

如果搜索包含以下任何内容,则会使用全局序号:

  • keywordipflattened 字段的桶聚合。这包括 termscompositediversified_samplersignificant_terms 聚合。

  • 对需要启用 fielddatatext 字段的聚合。

  • 使用 join 字段的父/子查询,例如has_child查询或 parent 聚合。

在字段上启用急切全局序号

以下请求创建一个名为 products 的索引,并启用了 eager_global_ordinals

PUT /products
{
  "mappings": {
    "properties": {
      "size": {
        "type": "keyword",
        "eager_global_ordinals": true
      }
    }
  }
}

以下请求索引一个文档:

PUT /products/_doc/1
{
  "size": "ABC123"
}

以下请求运行一个 terms 聚合:

POST /products/_search
{
  "size": 0,
  "aggs": {
    "size_agg": {
      "terms": {
        "field": "size"
      }
    }
  }
}