doc_values
doc_values参数是为了加快排序、聚合操作,在建立倒排索引的时候,额外增加一个列式存储映射,是一种空间换时间的做法。默认是开启的,大多数字段在索引时都会生成doc_values,但是text字段除外。对于确定不需要排序或者聚合的字段,可以关闭doc_values以节省磁盘空间。
PUT my_index
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword"
},
"session_id": {
"type": "keyword",
"doc_values": false
}
}
}
}
status_code字段默认开启doc_values。
session_id字段禁用了doc_values,但是仍能查询。
flieldData
query要解决的问题是,“包含查询关键词的文档有哪些”,aggregation刚好相反,aggregation要解决的问题是,“文档包含哪些词项”,大多数字段在索引时都会生成doc_values,但是text字段除外。取而代之,text字段在查询时会生成一个fielddata的数据结构,fielddata在字段首次被聚合、排序或者使用脚本的时候生成。ES通过读取磁盘上的倒排记录表重新生成文档词项关系,最后在java堆内存中排序。
text字段的fielddata属性默认是关闭的,开启fielddata非常消耗内存。给text字段开启fielddata的命令如下:
PUT my_index/_mapping
{
"properties": {
"my_field": {
"type": "text",
"fielddata": true
}
}
}