在对fielddata与doc_values进行的一些实验中,我遇到了一个奇怪的情况。在我以前的映射中,我根本没有使用doc值。在新的映射中,我已添加doc_values: true到映射中的所有字段,但分析的字符串字段和布尔值(直到2.0才受支持)除外。
doc_values: true
因此,详细而言,这是我的处理方式:
重新索引所有数据之前,我重新启动了ES 1.7集群,并使用排序,聚合和脚本字段运行查询以“预热”字段数据缓存。然后,我询问/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.desc.raw
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再次查询了端点,结果如下:
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是预期的布尔字段(即上面的字段),但令我惊讶的是,我的嵌套not_analyzed字符串字段也出现了,但是空间使用率却低得多。
some_bools
items.desc.raw仍然出现在字段数据缓存中的原因可能是什么?
我莫名其妙地忘记了全球常规。这就是为什么即使使用doc_values全局序号后仍不能包含,我仍然获得字段数据使用率的原因doc_values。
doc_values
在这里查看更多详细信息