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以下