elasticsearch 为什么全局序号是基于字段数据而不是文档值构建的?,elasticsearch,lucene,elasticsearch,Lucene" /> elasticsearch 为什么全局序号是基于字段数据而不是文档值构建的?,elasticsearch,lucene,elasticsearch,Lucene" />

elasticsearch 为什么全局序号是基于字段数据而不是文档值构建的?

elasticsearch 为什么全局序号是基于字段数据而不是文档值构建的?,elasticsearch,lucene,elasticsearch,Lucene,我有一个像这样的字段“位置” "location": { "type": "string", "index": "not_analyzed", "store": true, "fielddata": { "format": "doc_values" } }, 但是,当我将术语聚合用于此字段时,我会看到这种日志 [2015-05-13 15:42:56.210][DEBUG][ind

我有一个像这样的字段“位置”

 "location": {
        "type": "string",
        "index": "not_analyzed",
        "store": true,
        "fielddata": {
          "format": "doc_values"
        }
      },
但是,当我将术语聚合用于此字段时,我会看到这种日志

[2015-05-13 15:42:56.210][DEBUG][index.fielddata.plain] Global-ordinals[location][361372] took 206 ms
[2015-05-13 17:55:44.692][DEBUG][index.fielddata.plain] Global-ordinals[location][461584] took 230 ms
[2015-05-13 17:56:21.907][DEBUG][index.fielddata.plain] Global-ordinals[location][263096] took 1205 ms
我还可以看到Java堆的大小增加了,这导致了很长时间的垃圾收集

为什么doc_值字段使用java堆?因为我也存储它们?
我可以避免垃圾收集吗?

全局序号是将字段中的每个唯一项映射到唯一数字的结构。这需要生成,以便更好地存储指纹和计算

您可以了解有关全局序号的更多信息

以下是此链接在某一天死亡时的信息摘要:

全局序数 减少字符串字段数据内存使用的技术之一称为序数

假设我们有10亿个文档,每个文档都有一个
status
字段。只有三种状态:
status\u pending
status\u published
status\u deleted
。如果我们在内存中为每个文档保留完整的字符串状态,那么每个文档将使用14到16个字节,或者大约15GB

相反,我们可以识别三个唯一的字符串,对它们进行排序,并对它们进行编号:0、1、2

Ordinal | Term
-------------------
0       | status_deleted
1       | status_pending
2       | status_published
原始字符串在序号列表中只存储一次,每个文档只使用编号的序号来指向它包含的值

Doc     | Ordinal
-------------------------
0       | 1  # pending
1       | 1  # pending
2       | 2  # published
3       | 0  # deleted
这将内存使用从15 GB减少到1 GB以下