Kibana7.17.4多字段映射文本搜索高亮缺失问题咨询
测试场景说明
本次验证基于Elasticsearch、Kibana 7.17.4版本搭建对照环境,目标是实现ECS(弹性通用模式)规范下error.stack_trace字段的文本搜索高亮,分别对两类字段映射做效果对比:
- 根字段直接设置为
text类型 - 根字段设置为
wildcard类型,下挂text类型子字段的多字段结构
测试使用的索引创建、数据写入请求如下:
PUT simple-index-01 { "mappings": { "properties": { "stack_trace01": { "type": "text" }, "stack_trace02": { "fields": { "text": { "type": "text" } }, "type": "wildcard" } } } } POST simple-index-01/_doc { "@timestamp" : "2022-06-07T08:21:05.000Z", "stack_trace01": "java.lang.NullPointerException: null", "stack_trace02": "java.lang.NullPointerException: null" }
实测结果:根字段为text类型的stack_trace01可正常返回搜索高亮,wildcard+text子字段结构的stack_trace02无高亮结果。
结论
该现象属于Kibana 7.17.x版本的预期设计行为,并非功能bug。
原因说明
- Kibana 7.17.x版本全局搜索(含Discover页面)的默认高亮逻辑,只会将索引映射中的根字段加入高亮请求的字段列表,不会自动遍历多字段(multi-fields)结构下的子字段做高亮匹配。
stack_trace01为根字段直接映射text类型,高亮逻辑可直接命中根字段的分词索引,因此正常返回高亮结果。stack_trace02的根字段类型为wildcard,承担全文检索能力的text类型是其下挂子字段,实际索引路径为stack_trace02.text:Kibana默认全文检索逻辑确实会匹配该子字段的分词索引完成文档召回,但生成高亮请求时不会自动将这个子字段加入待高亮字段列表,因此无法返回对应高亮片段。- 该问题和Elasticsearch内核的高亮能力无关:直接在Dev Tools中手写搜索请求,手动将
stack_trace02.text加入高亮字段列表,即可正常返回高亮结果。
7.17版本适配方案
- 在索引模式(7.17版本尚未更名为Data View)的字段管理页,将多字段下的text子字段设置为可独立搜索、可展示的字段,即可被默认高亮逻辑识别匹配。
- 编写自定义查询DSL时,手动将需要高亮的多字段text子字段加入高亮参数的
fields列表,强制指定高亮字段。 - ECS标准默认给
error.stack_trace配置的就是wildcard根字段+text子字段的映射结构,该多字段默认不高亮的问题在8.x版本Kibana中已做优化,会自动识别多字段下的text子字段加入高亮列表,但该功能改动不会回溯到7.17的小版本更新中。
内容的提问来源于stack exchange,提问作者Bjarte Brandt
相关产品推荐
相关产品推荐

