概要
本篇主要介绍一个Term Vector的概念和基本使用方法。
term vector是什么?
每次有document数据插入时,elasticsearch除了对document进行正排、倒排索引的存储之外,如果此索引的field设置了term_vector参数,elasticsearch还会对这个的分词信息进行计算、统计,比如这个document有多少个field,每个field的值分词处理后得到的term的df值,ttf值是多少,每个term存储的位置偏移量等信息,这些统计信息统称为term vector。
term vector的值有5个
- no:不存储term vector信息,默认值
- yes:只存储field terms信息,不包含position和offset信息
- with_positions:存储term信息和position信息
- with_offsets:存储term信息和offset信息
- with_positions_offsets:存储完整的term vector信息,包括field terms、position、offset信息。
term vector的信息生成有两种方式:index-time和query-time。index-time即建立索引时生成term vector信息,query-time是在查询过程中实时生成term vector信息,前者以空间换时间,后者以时间换空间。
term vector有什么作用?
term vector本质上是一个数据探查的工具(可以看成是一个debugger工具),上面记录着一个document内的field分词后的term的详细情况,如拆分成几个term,每个term在正排索引的哪个位置,各自的df值、ttf值分别是多少等等。一般用于数据疑似问题的排查,比如说排序和搜索与预期的结果不一致,需要了解根本原因,可以拿这个工具手动进行数据分析,帮助判断问题的根源。
读懂term vector信息
我们来看看一个完整的term vector报文,都有哪些信息,带#号的一行代码是添加的注释,如下示例:
{
"_index": "music",
"_type": "children",
"_id": "1",
"_version": 1,
"found": true,
"took": 0,
"term_vectors": {
"text": {
"field_statistics": {
"sum_doc_freq": 3,
"doc_count": 1,
"sum_ttf": 3
},
"terms": {
"elasticsearch": {
"doc_freq": 1,
"ttf": 1,
"term_freq": 1,
"tokens": [
{
"position": 2,
"start_offset": 11,
"end_offset": 24
}