在fielddata vs doc_values的一些实验中,我遇到了一个奇怪的案例。在我之前的映射中,我根本没有使用doc值。在我的新映射中,我已将doc_values: true
添加到我的映射中的所有字段,但已分析的字符串字段和布尔值(not supported until 2.0)除外。
详细说明,以下是我的进展方式:
在重新索引我的所有数据之前,我重新启动了我的ES 1.7群集,并运行了一个带有排序,聚合和脚本字段的查询来预热"热身" fielddata缓存。然后我查询/fielddata
端点以了解fielddata缓存的使用情况。它看起来像这样:
curl -XGET 'localhost:9200/_cat/fielddata?v&fields=*'
id host ip node total items.desc.raw more_fields...
rKX7... myhost 192.168.1.100 Doom 32.9mb 2.3mb ...
如您所见,字段items.desc.raw
使用了2.3mb的堆空间。 items
属于nested
类型,其中包含一个字符串多字段,其中not_analyzed
子字段名为raw
。简而言之,该嵌套字段的映射如下所示:
"items": {
"type": "nested",
"properties": {
"desc": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
将doc_values: true
添加到items.desc.raw
后,重新索引整个索引并运行一些聚合,再次排序和编写脚本来预热fielddata缓存,我再次查询/fielddata
端点,这里是结果:
curl -XGET 'localhost:9200/_cat/fielddata?v&fields=*'
id host ip node total items.desc.raw some_bools...
tAB5... myhost 192.168.1.100 Yack 2.1mb 9.2kb ...
所以fielddata的用法确实已大大降低(这很好),我看到的唯一字段是布尔字段(即some_bools
以上),这是预期的,但令我惊讶的是,我的嵌套{{1} }字符串字段也出现了,但空间使用率要低得多。
not_analyzed
仍然出现在fielddata缓存中的原因是什么?
答案 0 :(得分:2)
不知怎的,我忘记了global ordinals。它们是我使用doc_values
后仍然使用fielddata的原因,因为doc_values
无法包含全局序数。