返回

深入剖析 Elasticsearch doc_values 和 global_ordinals 的奥秘

后端

信息爆炸时代的搜索挑战

随着数据量的爆炸式增长,如何在海量信息中快速准确地提取有效信息已成为一个重大挑战。Elasticsearch,这款强大的开源分布式搜索引擎,凭借其卓越的搜索能力和丰富的功能特性,成为了企业和组织管理数据的首选工具。

倒排索引的局限性

Elasticsearch 使用倒排索引作为其核心的数据结构,它通过将术语映射到包含它们的文档来优化搜索性能。然而,这种结构在处理聚合、排序和脚本访问字段时存在一些局限性。

doc_values 和 global_ordinals 的引入

为了解决这些问题,Elasticsearch 引入了两个重要的数据结构:doc_values 和 global_ordinals。

doc_values

doc_values 允许我们将原始字段值存储在索引的单独段文件中,并采用压缩后的数据结构。这使得它非常适合进行聚合、排序和脚本访问字段的操作。通过多种方式,我们可以访问这些数据,例如通过 doc value source 获取特定字段的值,或通过 scripted doc values source 计算字段表达式。

global_ordinals

global_ordinals 是对 doc_values 进行编码后生成的一系列整数值。这些整数值可以唯一标识一个字段值,使得我们能够对其进行排序和聚合操作。

doc_values 和 global_ordinals 的优势

使用 doc_values 和 global_ordinals 可以带来以下优势:

  • 提升性能:这两种数据结构可以显著提高聚合、排序和脚本访问字段的性能。
  • 减小索引大小:doc_values 存储的是压缩后的数据结构,有助于减小索引大小。
  • 降低内存消耗:由于 doc_values 存储在单独的段文件中,因此可以降低内存消耗。

何时使用 doc_values 和 global_ordinals

  • 当需要进行聚合、排序或在脚本中访问字段时,应使用 doc_values
  • 当需要对字段值进行排序或聚合时,应使用 global_ordinals

使用示例

使用 doc_values 进行聚合

以下是一个使用 doc_values 进行聚合的示例:

POST /my_index/_search
{
  "size": 0,
  "aggs": {
    "max_age": {
      "max": {
        "field": "age"
      }
    }
  }
}

使用 doc_values 进行排序

以下是一个使用 doc_values 进行排序的示例:

POST /my_index/_search
{
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

使用 doc_values 在脚本中访问字段

以下是一个使用 doc_values 在脚本中访问字段的示例:

POST /my_index/_search
{
  "query": {
    "script": {
      "source": "doc['age'].value"
    }
  }
}

使用 global_ordinals 进行排序

以下是一个使用 global_ordinals 进行排序的示例:

POST /my_index/_search
{
  "sort": [
    {
      "age": {
        "order": "desc",
        "mode": "global_ordinals"
      }
    }
  ]
}

使用 global_ordinals 进行聚合

以下是一个使用 global_ordinals 进行聚合的示例:

POST /my_index/_search
{
  "size": 0,
  "aggs": {
    "max_age": {
      "max": {
        "field": "age",
        "mode": "global_ordinals"
      }
    }
  }
}

结论

doc_values 和 global_ordinals 是 Elasticsearch 中至关重要的数据结构。通过优化聚合、排序和脚本访问字段,它们显著提升了搜索引擎的性能。合理使用这些数据结构,企业和组织可以充分利用 Elasticsearch 的强大功能,从海量数据中快速高效地提取见解。

常见问题解答

1. doc_values 和 global_ordinals 的主要区别是什么?

doc_values 存储原始字段值,非常适合聚合、排序和脚本访问字段。而 global_ordinals 是对 doc_values 进行编码后的整数值,更适合进行排序和聚合操作。

2. 何时应该使用 doc_values?

当需要对字段进行聚合、排序或在脚本中访问字段时,应使用 doc_values。

3. 何时应该使用 global_ordinals?

当需要对字段值进行排序或聚合时,应使用 global_ordinals。

4. doc_values 和 global_ordinals 会增加索引大小吗?

doc_values 会增加索引大小,但 global_ordinals 不会。

5. doc_values 和 global_ordinals 会降低查询性能吗?

虽然使用 doc_values 和 global_ordinals 可能会增加查询延迟,但它们可以显著提高聚合、排序和脚本访问字段的性能。