概要

本篇主要介绍一个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报文,都有哪些信息,带#号的一行代码是添加的注释,如下示例:

  1. {
  2. "_index": "music",
  3. "_type": "children",
  4. "_id": "1",
  5. "_version": 1,
  6. "found": true,
  7. "took": 0,
  8. "term_vectors": {
  9. "text": {
  10. "field_statistics": {
  11. "sum_doc_freq": 3,
  12. "doc_count": 1,
  13. "sum_ttf": 3
  14. },
  15. "terms": {
  16. "elasticsearch": {
  17. "doc_freq": 1,
  18. "ttf": 1,
  19. "term_freq": 1,
  20. "tokens": [
  21. {
  22. "position": 2,
  23. "start_offset": 11,
  24. "end_offset": 24
  25. }
  26. ]
  27. },
  28. "hello": {
  29. "doc_freq": 1,
  30. "ttf": 1,
  31. "term_freq": 1,
  32. "tokens": [
  33. {
  34. "position": 0,
  35. "start_offset": 0,
  36. "end_offset": 5
  37. }
  38. ]
  39. },
  40. "java": {
  41. "doc_freq": 1,
  42. "ttf": 1,
  43. "term_freq": 1,
  44. "tokens": [
  45. {
  46. "position": 1,
  47. "start_offset": 6,
  48. "end_offset": 10
  49. }
  50. ]
  51. }
  52. }
  53. }
  54. }
  55. }

一段完整的term vector信息,term vector是按field为维度来统计的,主要包含三个部分:

  • field statistics
  • term statistics
  • term information

field statistics

指该索引和type下所有的document,对这个field所有term的统计信息,注意document的范围,不是某一条,是指定index/type下的所有document。

  • sum_doc_freq(sum of document frequency):这个field中所有的term的df之和。
  • doc_count(document count):有多少document包含这个field,有些document可能没有这个field。
  • sum_ttf(sum of total term frequency):这个field中所有的term的tf之和。

term statistics

hello为当前document中,text field字段分词后的term,查询时设置term_statistics=true时生效。

  • doc_freq(document frequency):有多少document包含这个term。
  • ttf(total term frequency):这个term在所有document中出现的频率。
  • term_freq(term frequency in the field):这个term在当前document中出现的频率。

term information

示例中tokens里面的内容,tokens里面是个数组

  • position:这个term在field里的正排索引位置,如果有多个相同的term,tokens下面会有多条记录。
  • start_offset:这个term在field里的偏移,表示起始位置偏移量。
  • end_offset:这个term在field里的偏移量,表示结束位置偏移量。

term vector使用案例

  1. 建立索引music,type命名为children,指定text字段为index-time,fullname字段为query-time
  1. PUT /music
  2. {
  3. "mappings": {
  4. "children": {
  5. "properties": {
  6. "content": {
  7. "type": "text",
  8. "term_vector": "with_positions_offsets",
  9. "store" : true,
  10. "analyzer" : "standard"
  11. },
  12. "fullname": {
  13. "type": "text",
  14. "analyzer" : "standard"
  15. }
  16. }
  17. }
  18. }
  19. }
  1. 添加3条示例数据
  1. PUT /music/children/1
  2. {
  3. "fullname" : "Jean Ritchie",
  4. "content" : "Love Somebody"
  5. }
  6. PUT /music/children/2
  7. {
  8. "fullname" : "John Smith",
  9. "content" : "wake me, shark me ..."
  10. }
  11. PUT /music/children/3
  12. {
  13. "fullname" : "Peter Raffi",
  14. "content" : "brush your teeth"
  15. }
  1. 对document id为1这条数据进行term vector探查
  1. GET /music/children/1/_termvectors
  2. {
  3. "fields" : ["content"],
  4. "offsets" : true,
  5. "positions" : true,
  6. "term_statistics" : true,
  7. "field_statistics" : true
  8. }

得到的结果即为上文的term vector示例。

另外可以提一下,用这3个document的id进行查询,field_statistics部分是一样的。

term vector常见用法

除了上一节的标准查询用法,还有一些参数可以丰富term vector的查询。

  • doc参数
  1. GET /music/children/_termvectors
  2. {
  3. "doc" : {
  4. "fullname" : "Peter Raffi",
  5. "content" : "brush your teeth"
  6. },
  7. "fields" : ["content"],
  8. "offsets" : true,
  9. "positions" : true,
  10. "term_statistics" : true,
  11. "field_statistics" : true
  12. }

这个语法的含义是针对指定的doc进行term vector分析,doc里的内容可以随意指定,特别实用。

  • per_field_analyzer参数

    可以指定字段的分词器进行探查
  1. GET /music/children/_termvectors
  2. {
  3. "doc" : {
  4. "fullname" : "Jimmie Davis",
  5. "content" : "you are my sunshine"
  6. },
  7. "fields" : ["content"],
  8. "offsets" : true,
  9. "positions" : true,
  10. "term_statistics" : true,
  11. "field_statistics" : true,
  12. "per_field_analyzer" : {
  13. "text": "standard"
  14. }
  15. }
  • filter参数

    对term vector统计结果进行过滤
  1. GET /music/children/_termvectors
  2. {
  3. "doc" : {
  4. "fullname" : "Jimmie Davis",
  5. "content" : "you are my sunshine"
  6. },
  7. "fields" : ["content"],
  8. "offsets" : true,
  9. "positions" : true,
  10. "term_statistics" : true,
  11. "field_statistics" : true,
  12. "filter" : {
  13. "max_num_terms" : 3,
  14. "min_term_freq" : 1,
  15. "min_doc_freq" : 1
  16. }
  17. }

根据term统计信息,过滤出你想要看到的term vector统计结果。也挺有用的,比如你探查数据可以过滤掉一些出现频率过低的term。

  • docs参数

    允许你同时对多个doc进行探查,这个使用频率看个人习惯。
  1. GET _mtermvectors
  2. {
  3. "docs": [
  4. {
  5. "_index": "music",
  6. "_type": "children",
  7. "_id": "2",
  8. "term_statistics": true
  9. },
  10. {
  11. "_index": "music",
  12. "_type": "children",
  13. "_id": "1",
  14. "fields": [
  15. "content"
  16. ]
  17. }
  18. ]
  19. }

term vector使用建议

有两种方式可以得到term vector信息,一种是像上面案例,建立时指定,另一种是直接查询时生成

  • index-time,在mapping里配置,建立索引的时候,就直接给你生成这些term和field的统计信息,如果term_vector设置为with_positions_offsets,索引所占的空间是不设置term vector时的2倍。
  • query-time,你之前没有生成过任何的Term vector信息,然后在查看term vector的时候,直接就可以看到了,会on the fly,现场计算出各种统计信息,然后返回给你。

这两种方式采用哪种取决于对term vector的使用期望,query-time更常用一些,毕竟这个工具的用处是协助定位问题,实时计算就行。

小结

term vector是一个比较实用的工具,尤其是针对线上数据进行分析、协助问题定位的时候,可以派上很大的用场。

专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java架构社区

可以扫左边二维码添加好友,邀请你加入Java架构社区微信群共同探讨技术

Elasticsearch系列---Term Vector工具探查数据的更多相关文章

  1. 基于term vector深入探查数据

    1.term vector介绍 获取document中的某个field内的各个term的统计信息 term information: term frequency in the field, term ...

  2. C#进阶系列——WebApi 接口测试工具:WebApiTestClient

    前言:这两天在整WebApi的服务,由于调用方是Android客户端,Android开发人员也不懂C#语法,API里面的接口也不能直接给他们看,没办法,只有整个详细一点的文档呗.由于接口个数有点多,每 ...

  3. Map工具系列-01-Map代码生成工具说明

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  4. Web 软件测试 Checklist 应用系列,第 1 部分: 数据输入

    Web 软件测试 Checklist 应用系列,第 1 部分: 数据输入 本文为系列文章"Web 软件测试 Checklist 应用系列"中的第一篇.该系列文章旨在阐述 Check ...

  5. Java 集合系列 05 Vector详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  7. elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...

  8. elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)

    一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...

  9. Red Gate系列 - SQL各种工具

    Red Gate系列 - SQL各种工具 Red Gate系列文章: Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程 Red ...

随机推荐

  1. Python 编程环境搭建(Windows 系统中)

    由于大家普遍使用 Windows 系统,所以本文只介绍 Windows 系统中 Python 环境的安装. 在 Windows 中安装 Python 与安装普通软件没什么差别,下载所需版本的安装包后, ...

  2. L5语言模型与数据集

    本次实验使用的数据下载: jaychou_lyrics.txt 链接:https://pan.baidu.com/s/1LJSrkpV84YF61OPmjIHGIw 提取码:dj53 语言模型 一段自 ...

  3. D - A Game with Traps-- codeforces 1260D A

    题目大意: 一共有m个士兵,k个陷阱,时间为t,一个首领,这个首领需要在t时间内尽可能多的将士兵带到boos的面前, 第二行是每个士兵的灵敏度. 紧接着是k个陷阱,每个陷阱有l,,r,,d组成,l代表 ...

  4. .NET Core 发布时去掉多余的语言包文件夹

    用 .NET Core 3.x 作为目标框架时发布完之后,会发现多了很多语言包文件夹,类似于: 有时候,不想要生成这些语言包文件夹,需要稍微配置一下. 在 PropertyGroup 节点中添加如下的 ...

  5. 初始化 RESTful API 风格的博客系统

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在 HelloDjango 全栈系列教程的第一步--Django博客教程(第二版)中 ...

  6. s3fs-fuse 把 s3-like 对象存储挂载到本地

    s3fs-fuse 是一个采用 c++

  7. kubernetes删除pod,pod一直处于Terminating状态

    删除pod,pod一直处于Terminating状态 [root@yxz-cluster01 deploy_yaml]# kubectl get pod -n yunanbao NAME READY ...

  8. Redis分布式锁的正确姿势

    1. 核心代码: import redis.clients.jedis.Jedis; import java.util.Collections; /** * @Author: qijigui * @C ...

  9. windows下部署.netcore+docker系列一(安装linux (ubuntu18.4))

    1 下载 虚拟机和 linux 系统 版本是 ubuntu 链接:https://pan.baidu.com/s/1jTxdysoyOhSWD-Ea-7JIbg 提取码:iiad 2  首先要安装 虚 ...

  10. css的变量教程,更强大的css

    当微软宣布 Edge 浏览器将支持 CSS 变量.这个重要的 CSS 新功能,所有主要浏览器已经都支持了.本文全面介绍如何使用它,你会发现原生 CSS 从此变得异常强大. 一.变量的声明 声明变量的时 ...