_termvectors 是什么
_termvectors 返回某个文档字段的分词结果与词频,用来验证写入后实际索引进去的内容,排查同义词、分词器以及查询与索引不一致的问题。接口形式是 GET /<index>/_termvectors/<id>?fields=...,返回 tokens(词条、位置、偏移)与 terms(词频)。字段没有单独配置 term_vector 时,服务端会大致从 _source 重新分析一遍,结果与真正的索引内容可能存在细微差别。
基本信息
| 接口 | GET /<index>/_termvectors/<id>?fields=message |
|---|---|
| 返回 | tokens(词条与位置)与 terms(词频) |
| 常用参数 | fields、term_statistics、positions、offsets |
| 前提 | 字段配置 term_vector 后返回精确存储内容 |
| 对照接口 | _analyze 用于查看分析器的输出 |
典型使用场景
- 排查查不到:对比写入分析与查询分析的差异
- 验证分词:确认中文或自定义分析器把文本切成了预期的词条
- 检查词频:看某词在字段里出现了几次,辅助判断相关性
- 核对同义词:确认同义词在索引阶段是否已经展开
- 无 _source 场景:关闭了 _source 但开启 term_vector 时仍能查词条
查询与对照
查询与对照
GET /my-index/_termvectors/1?fields=message&term_statistics=true&positions=true
GET /my-index/_termvectors/1?fields=message&offsets=true&positions=true
# 对照:查询侧的分析结果
POST /my-index/_analyze
{
"field": "message",
"text": "elasticsearch tutorial"
}返回值读法
| 返回项 | 含义 | 读法 |
|---|---|---|
| tokens | 词条及位置偏移 | 看切分是否符合预期 |
| terms | 词频统计 | 判断某词在字段里出现几次 |
| term_statistics | 全局词频 | 未存储时返回为空 |
| positions | 位置信息 | 短语查询能否命中与此相关 |
| offsets | 字符偏移 | 高亮范围依赖它 |
搜索无命中的排查思路:先用 _analyze 看查询词被切成什么,再用 _termvectors 看文档里实际存了什么,两边一对就能确认问题出在写入分析还是查询分析。
大字段的 termvectors 响应可能非常大,调试时限定 fields 与返回参数,避免一次拉回整篇文档的全部词条把客户端拖垮。
它是单文档视角的调试工具:想批量观察某字段的分词结果应改用 _analyze,逐条调用在数据量大时不可行。
位置与偏移信息在部分字段配置下并不存储,返回为空不代表分词失败,先确认该字段是否开启了对应选项再下结论。