elasticsearch高亮之词项向量
一、什么是词项向量
词项向量(term vector)是有elasticsearch在index document的时候产生,其包含对document解析过程中产生的分词的一些信息,例如分词在字段值中的位置、开始和结束的字符位置、分词的元数据payloads等;
term vector是单独进行存储的,会额外多占用一杯的空间,所以elasticsearch默认情况下禁用词项向量,如果要启用,我们需要在字段的mapping中使用term_vector进行设置;
二、term_vector的配置选项
term vector支持以下配置选项
配置选项 | 描述 |
---|---|
no | 不启用term vector,默认值 |
yes | 启用term vector,但是仅仅记录分词 |
with_positions | 启用term vector, 记录分词及分词在字符串中的位置 |
with_offsets | 启用term vector, 记录分词在字符串中的起始字符位置 |
with_positions_offsets | 启用term vector, 记录分词在字符串中的位置及起始的字符位置 |
with_positions_payloads | 启用term vector, 记录分词在字符串中的位置及payloads |
with_positions_offsets_payloads | 启用term vector, 记录分词在字符串中的位置、起始字符位置及payloads |
我们使用以下mapping配置,为text、fullname字段启用term vector;
PUT /term_vector_test/
{
"mappings":{
"_doc":{
"properties":{
"text":{
"type":"text",
"term_vector":"with_positions_offsets_payloads",
"store":true,
"analyzer":"standard"
},
"fullname":{
"type":"text",
"term_vector":"with_positions_offsets_payloads",
"analyzer":"standard"
}
}
}
},
"settings":{
"index":{
"number_of_shards":1,
"number_of_replicas":0
}
}
}
将以下两个document发送到elasticsearch进行index;
PUT /term_vector_test/_doc/1
{
"fullname" : "John Doe",
"text" : "twitter test test test "
}
PUT /term_vector_test/_doc/2
{
"fullname" : "Jane Doe",
"text" : "Another twitter test ..."
}
三、查看term vector的数据结构
elasticsearch提供了_termvectors API,我们可以使用它来查看我们刚才index的doucment产生的term vector;
这个API每次只能查看特定的某个文档的term vector信息,我们可以通过url指定具体的document的_id;
term vector主要由term information、term statistics、field statistics构成,其中term information又分成了positions、offsets、payloads三个选项,我们可以通过请求的body的参数分别控制返回的信息;
下边我们查看id=1的文档的text字段的term vector信息;
GET /twitter/_doc/1/_termvectors
{
"fields" : ["text"],
"offsets" : true,
"payloads" : true,
"positions" : true,
"term_statistics" : true,
"field_statistics" : true
}
通过返回的信息可以看到erm vecter由三部分组成
分词基本信息
term position,分词在字段值中的位置,可以看到分词test在字段中占据下标为1、2、3三个位置,而分词twitter占据下标为0的位置;
start and end offsets, 分词在字段值中字符开始和结束位置,可以看到分词twitter的start_offset和end_offset分别为0和7;
term payloads,分词的元数据,可以看到每个分词的payload都是d29yZA==,从这里可以到elasticsearch默认值为 word;
term frequency,分词在字段值中出现的频率,可以看到分词twitter的term_freq是 1;
分词统计信息
total term frequency,当前分词在所有文档的当前字段中出现的频率,可以看到twitter的ttf是2,test的ttf是4;
document frequency,当前字段包含当前分词的文档的数量,可以看到两个document的text字段都包含test及twitter,所以两者的doc_freq为2;
字段统计信息
document count, 包含当前字段的document数量,这里两个文档都包含text字段,所以doc_count为2;
sum of document frequencies,当前字段中所有分词对应的document frequency的加和,这里以下计算可以得到sum_doc_freq为6;
\]
sum of total term frequencies,当前字段中所有分词对应的total term frequency的加和,这里以下计算可以得到sum_ttf为8;
\]
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"took" : 0,
"term_vectors" : {
"text" : {
"field_statistics" : {
"sum_doc_freq" : 6,
"doc_count" : 2,
"sum_ttf" : 8
},
"terms" : {
"test" : {
"doc_freq" : 2,
"ttf" : 4,
"term_freq" : 3,
"tokens" : [
{
"position" : 1,
"start_offset" : 8,
"end_offset" : 12,
"payload" : "d29yZA=="
},
{
"position" : 2,
"start_offset" : 13,
"end_offset" : 17,
"payload" : "d29yZA=="
},
{
"position" : 3,
"start_offset" : 18,
"end_offset" : 22,
"payload" : "d29yZA=="
}
]
},
"twitter" : {
"doc_freq" : 2,
"ttf" : 2,
"term_freq" : 1,
"tokens" : [
{
"position" : 0,
"start_offset" : 0,
"end_offset" : 7,
"payload" : "d29yZA=="
}
]
}
}
}
}
}
基于以下两点term statistics和field statistics并不是准确的;
删除的文档不会计算在内;
只计算请求文档所在的分片的数据;
elasticsearch高亮之词项向量的更多相关文章
- ElasticStack学习(九):深入ElasticSearch搜索之词项、全文本、结构化搜索及相关性算分
一.基于词项与全文的搜索 1.词项 Term(词项)是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term. Term的使用说明: 1)Term Level Query:Ter ...
- elasticsearch算法之词项相似度算法(一)
一.词项相似度 elasticsearch支持拼写纠错,其建议词的获取就需要进行词项相似度的计算:今天我们来通过不同的距离算法来学习一下词项相似度算法: 二.数据准备 计算词项相似度,就需要首先将词项 ...
- elasticsearch算法之词项相似度算法(二)
六.莱文斯坦编辑距离 前边的几种距离计算方法都是针对相同长度的词项,莱文斯坦编辑距离可以计算两个长度不同的单词之间的距离:莱文斯坦编辑距离是通过添加.删除.或者将一个字符替换为另外一个字符所需的最小编 ...
- 词嵌入向量WordEmbedding
词嵌入向量WordEmbedding的原理和生成方法 WordEmbedding 词嵌入向量(WordEmbedding)是NLP里面一个重要的概念,我们可以利用WordEmbedding将一个单 ...
- TF-IDF词项权重计算
一.TF-IDF 词项频率: df:term frequency. term在文档中出现的频率.tf越大,词项越重要. 文档频率: tf:document frequecy.有多少文档包括此term, ...
- 词项邻近 & 停用词 & 词干还原
[词项邻近] 邻近操作符(proximity)用于指定查询中的两个词项应该在文档中互相靠近,靠近程度通常采用两者之间的词的个数或者是否同在某个结构单元(如句 子或段落)中出现来衡量. [停用词] 一些 ...
- ES 入门 - 基于词项的查询
准备 首先先声明下,我这里使用的 ES 版本 5.2.0. 为了便于理解,这里以如下 index 为格式,该格式是通过 PMACCT 抓取的 netflow 流量信息, 文中所涉及的到的例子,全基于此 ...
- ElasticSearch IK热词自动热更新原理与Golang实现
热更新概述 ik分词器本身可以从配置文件加载扩张词库,也可以从远程HTTP服务器加载. 从本地加载,则需要重启ES生效,影响比较大.所以,一般我们都会把词库放在远程服务器上.这里主要有2种方式: 借助 ...
- elasticsearch高亮之highlight原理
一.highlight简介 highlight是提升用户体验的重要手段,搜索引擎通过高亮突出命中关键字等方式,方便用户通过关键字周围的信息快速的确认是否是自己希望的结果: highlight功能通常包 ...
随机推荐
- mac每次打开终端都需要source ~/.bashrc以及~/.bash_profile问题
问题描述 在学习git的时候在~/.bashrc下面配置了git log命令的别名 #用于输出git提交日志 alias git-log='git log --pretty=oneline --all ...
- java实现HTTPS单向认证&TLS指定加密套件
1.HTTPS介绍 由于HTTP是明文传输,会造成安全隐患,所以在一些特定场景中,必须使用HTTPS协议,简单来说HTTPS=HTTP+SSL/TLS.服务端和客户端的信息传输都是通过TLS进行加密. ...
- linnux命令 - brctl和ifconfig
1.安装brctl centos7.6安装使用 yum install bridge-utils ubuntu使用 apt-get install bridge-utils 什么是网桥 网桥是一种在链 ...
- SpringAOP/切面编程示例
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11833954.html Spring AOP/切面编程实例和一些注意事项, 主要是利用注解来实 ...
- 区区牛马蹉跎 ,不要向生活低下头 Linux的账号和管理
账户和管理权限 1.管理用户账号和组账号 2.管理目录和文件的属性 1.Linux基于用户身份对资源访问进行控制:用户账号(超级用户.普通用户.程序用户) 组账号(基本组.附加组).UID (用户标识 ...
- 替小白整理的 linux基操命令 切勿扣6 不用感谢
Linux --------小白必会的基本命令 命令行提示字符[root@localhost ~]#[当前登录系统的用户@主机名称 当前所在的目录]## 表示为管理员登录$ 表示为普通用户登录 切 ...
- Python支付宝单笔转账接口
开发信息 接口加签方式为证书模式 证书模式好处是可以使用支付宝的转账到支付宝账户,也就是提现功能,公钥模式不能实现转账到支付宝账户. 此DEMO利用单笔转账到支付宝账户接口[提现功能]用户可以通过此D ...
- k8s 通过helm发布应用
什么是helm? Helm 是 Kubernetes 的包管理器.Helm 是查找.分享和使用软件构建 Kubernetes 的最优方式. 在红帽系的Linux中我们使用yum来管理RPM包,类似的, ...
- 《SelfClass》——Docker
<SelfClass>--Docker 根据我的个人计划,我需要先了解一下Docker,并且能够使用起来. 目的:在我Mac上搭建一个Docker,在Docker上搭建一个MySQL数据库 ...
- Java不支持协程?那是你不知道Quasar!
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在编程语言的这个圈子里,各种语言之间的对比似乎就一直就没有停过,像什么古早时期的"PHP是世界上最好的语言"就不提了,最近我 ...