Kibana最吸引我的地方莫过于可视化(visualize),结合桶(buckets)与指标(metrics)能创造出无穷无尽的图形,但是在实践中发现text字段无法进行聚合操作,如果用DSL语句操作,提示如下错误:
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [dept] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}
]
于是仔细搜索了Fielddata的相关知识,启用倒是简单,但无论是elasticsearch还是运行中的kibana都提示不建议启用fielddata,原因是不仅耗费大量的内存(一旦被载入到内存中,相关的数据段销毁之前,它都一直待在内存中),而且检索数据的延迟会非常严重,用户体验较差,所以默认的映射中会自动关闭此功能,启用的方法如下:
# 改变映射信息,强烈不推荐此方法
PUT my_index/_mapping/my_type
{
"properties": {
"my_field": {
"type": "text",
"fielddata": true
}
}
}
推荐的方法为创建额外的关键字映射,如下:
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
改变映射关系后,现在就可以对相关字段建立通关系了,只不过建立桶字段已由“my_field”改为“my_field.keyword”。【注:在添加数据时,不需要对my_field.keyword进行设值。】
结论
可视化的关键是对桶的划分,所以在可视化之前,最好是在创建映射之前,就充分考虑字段是否要进行聚合操作。