是的,在 Elasticsearch 中,当您在脚本查询(Script Query)中访问字段值时,默认情况下会使用 `doc values`。这是因为 `doc values` 是一种列式存储结构,专门为排序、聚合以及脚本中的字段访问等操作优化设计的。它们在索引时间生成,并存储在磁盘上,这使得它们非常适合于需要高效访问字段值但不需要全文搜索功能的场景。
### 脚本查询与 Doc Values
1. **默认行为**:
- 当您在脚本中访问某个字段的值时,Elasticsearch 会自动尝试从该字段的 `doc values` 中读取数据。这样做可以避免从 `_source` 字段重新解析整个文档,从而提高性能并减少内存使用。
2. **性能优势**:
- 使用 `doc values` 可以显著提高脚本查询的性能,尤其是在处理大规模数据集时。由于 `doc values` 以列式格式存储,相同字段的所有值都被连续存储在一起,这使得扫描和检索这些值的操作更加高效。
3. **例外情况**:
- 如果某个字段没有启用 `doc values`(例如某些情况下为了节省存储空间而禁用),那么在脚本中访问该字段时,Elasticsearch 将不得不回退到解析 `_source` 字段来获取所需值。这种做法效率较低,尤其是在 `_source` 包含大量数据或复杂嵌套结构的情况下。
### 示例
假设我们有一个包含产品信息的索引,其中每个文档都有一个 `price` 字段。我们可以编写一个脚本查询来查找价格高于平均值的产品:</