急切全局序号
eager_global_ordinals
映射参数控制字段的全局序号何时构建。启用后,全局序号在索引刷新期间计算,而不是在查询执行期间“惰性”计算。这可以提高依赖全局序号的操作的性能,例如,对 keyword
字段进行排序和聚合。但是,它也可能增加索引刷新时间和内存使用。
全局序号表示从术语值到整数标识符的映射,并在内部用于快速执行聚合和排序操作。通过“急切”加载它们,系统以索引期间额外的预处理为代价,减少了查询延迟。
默认情况下,eager_global_ordinals
是禁用的,以确保集群针对索引速度进行了优化。
全局序号存储在字段数据缓存中并占用堆内存。高基数字段会消耗大量堆内存。为防止内存相关问题,仔细配置字段数据断路器设置至关重要。
何时使用全局序号
如果搜索包含以下任何内容,则使用全局序号
- 对
keyword
、ip
和flattened
字段进行桶聚合。这包括terms
、composite
、diversified_sampler
和significant_terms
聚合。 - 对需要启用
fielddata
的text
字段进行聚合。 - 使用
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"
}
}
}
}