Elasticsearch系列---倒排索引原理与分词器
概要
本篇主要讲解倒排索引的基本原理以及ES常用的几种分词器介绍。
倒排索引的建立过程
倒排索引是搜索引擎中常见的索引方法,用来存储在全文搜索下某个单词在一个文档中存储位置的映射。通过倒排索引,我们输入一个关键词,可以非常快地获取包含这个关键词的文档列表。
我们先看英文的,假设我们有两个文档:
- I have a friend who loves smile
- love me, I love you
为了建立倒排索引,我们先按最简单的用空格把每个单词分开,可以得到如下结果:
*表示该列文档中有这个词条,为空表示没有该词条
Term | doc1 | doc2 |
---|---|---|
I | * | * |
have | * | |
a | * | |
friend | * | |
who | * | |
loves | * | |
smile | * | |
love | * | |
me | * | |
you | * |
如果我们要搜索 I love you,我们只需要查找包含每个词条的文档:
Term | doc1 | doc2 |
---|---|---|
I | * | * |
love | * | |
you | * |
两个文档都能匹配上,如果按命中词条数量来算,doc2比doc1更匹配。
这个是倒排索引最简化的表达方式,在ES的倒排索引存储结果中,还会记录每个词条在文档中出现的位置。
期望的分词处理
我们再看一下这个索引的建立过程,loves和love有区别吗?没有,都是爱的意思,一个是第三人称单数,一个是原形。如果能将一些语法的区别处理掉,这样的搜索结果是不是更切合实际需求?
例如:
- loves提取词干处理成love
- a,have之类的无实义的词,直接屏蔽掉
- 等等
现在索引看上去成这样:
Term | doc1 | doc2 |
---|---|---|
friend | * | |
love | * | * |
smile | * | |
me | * | |
you | * |
这样是不是精简了很多?
这个过程叫normalization,在建立倒排索引的时候,会执行一系列的操作,对拆分出的各个单词进行相应的处理,以提升后面搜索的时候能够搜索到相关联的文档的概率,如时态的转换,单复数的转换,同义词的转换,大小写的转换等。
分词器登场
分词器的作用就是把整篇文档,按一定的语义切分成一个一个的词条,目标是提升文档的召回率,并降低无效数据的噪音。
recall召回率,也叫可搜索性,指搜索的时候,增加能够搜索到的结果的数量。
降噪:指降低文档中一些低相关性词条对整体搜索排序结果的干扰。
文档的分词过程包含以下几步:
- 字符过滤器
对字符串进行预处理,如HTML标签清洗Love --> Love,I & you --> I and you等等。
- 分词器
把字符串切分成单个的词条,如英文的按空格和标点切分,中文的按词语切分,针对不同的语言,有不同的分词器,有相对简单的标准分词器,也有特别复杂的中文分词器,里面包含了非常复杂的切分逻辑如:
I Love you --> I/Love/you
我和我的祖国 --> 我/和/我的/祖国
- Token过滤器
将分词器得到的词条进一步的处理,如改变词条(英文词干提取loves --> love),删除无实际意义的词条(英文的a, and, this,中文的"的","了","吗"),增加词条(补充同义词)
分词器非常重要,好的分词器可以显著提升召回率,不恰当的分词器得到的结果可能会对搜索产生歧义,最后处理好的结果再拿去建立倒排索引。
常见分词器介绍
Elasticsearch自身提供了内置的分词器,也允许使用第三方的分词器。
内置分词器
- 标准分词器standard analyzer
ES默认分词器,根据Unicode联盟定义的单词边界划分文本,删除绝大部分标点,最后将词条小写。
- 简单分词器simple analyzer
在任何不是字母的地方分隔文本,将词条小写
- 空格分词器whitespace analyzer
在空格的地方划分文本
- 语言分词器language analyzer
特定的语言的分词器,如english,英语分词器,维护了一组英语停用词and、the之类的,用于删除词条,针对英文语法规则,有提取单词词干的能力。
内置的分词器主要是对英文的支持效果比较好,中文则需要使用外部的分词器。
外部分词器
IK中文分词器ik_max_word
会将文本做最细粒度的拆分;尽可能多的拆分出词语。
如南京市长江大桥 --> 南京市/南京/市长/长江大桥/长江/大桥IK中文分词器ik_smart
会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有
如南京市长江大桥 --> 南京市/长江大桥中日韩文分词器cjk
支持亚洲语言中文,日文,韩文
如南京市长江大桥 --> 南京/京市/市长/长江/江大/大桥阿里中文分词器aliws
阿里自研的中文分词器
如南京市长江大桥 --> 南京/市/长江/大桥
外部分词器众多,开源也有很多,有针对不同语言,不同领域的,各位可以结合自身业务的特点,挑选适合自己的分词器,这里就不一一介绍了,有兴趣自己可以去了解一下。
集成分词器
以Elasticsearch 6.3.1版本为例,集成IK分词器,其他的分词器过程也类似,在ES的bin目录下执行插件安装命令即可:
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.1/elasticsearch-analysis-ik-6.3.1.zip
其中install后面的那个的地址是 elasticsearch-analysis-ik 的github release对应ES版本的下载地址。
安装成功后,ES启动日志就能看到如下信息:
[2019-11-27T12:17:15,255][INFO ][o.e.p.PluginsService] [node-1] loaded plugin [analysis-ik]
测试分词效果
ES有analyze API来查看文本是如何被分词的,可用来做学习和调试用,请求命令如下:
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "南京市长江大桥"
}
响应结果:
{
"tokens": [
{
"token": "南京市",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
},
{
"token": "南京",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 1
},
{
"token": "市长",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 2
},
{
"token": "长江大桥",
"start_offset": 3,
"end_offset": 7,
"type": "CN_WORD",
"position": 3
},
{
"token": "长江",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 4
},
{
"token": "大桥",
"start_offset": 5,
"end_offset": 7,
"type": "CN_WORD",
"position": 5
}
]
}
小结
本篇主要介绍了倒排索引的基本思路,展示了简化后的结构,并阐述了分词处理的基本步骤。目前市面上流行的分词器组件特别多,开源的社区也非常活跃,各位可根据实际的项目需求背景,挑选适合的进行集成 ,注意版本号的兼容性问题即可。
专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java架构社区
Elasticsearch系列---倒排索引原理与分词器的更多相关文章
- ElasticSearch搜索引擎安装配置中文分词器IK插件
近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...
- nlp任务中的传统分词器和Bert系列伴生的新分词器tokenizers介绍
layout: blog title: Bert系列伴生的新分词器 date: 2020-04-29 09:31:52 tags: 5 categories: nlp mathjax: true ty ...
- 使用Docker 安装Elasticsearch、Elasticsearch-head、IK分词器 和使用
原文:使用Docker 安装Elasticsearch.Elasticsearch-head.IK分词器 和使用 Elasticsearch的安装 一.elasticsearch的安装 1.镜像拉取 ...
- Elasticsearch笔记六之中文分词器及自定义分词器
中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文"北京大学"来查询结果es将其分拆为"北","京","大" ...
- elasticsearch插件安装之--中文分词器 ik 安装
/** * 系统环境: vm12 下的centos 7.2 * 当前安装版本: elasticsearch-2.4.0.tar.gz */ ElasticSearch中内置了许多分词器, standa ...
- ElasticSearch速学 - IK中文分词器远程字典设置
前面已经对”IK中文分词器“有了简单的了解: 但是可以发现不是对所有的词都能很好的区分,比如: 逼格这个词就没有分出来. 词库 实际上IK分词器也是根据一些词库来进行分词的,我们可以丰富这个词库. ...
- Elasticsearch集群使用ik分词器
IK分词插件的安装 ES集群环境 VMWare下三台虚拟机Ubuntu 14.04.2 LTS JDK 1.8.0_66 Elasticsearch 2.3.1 elasticsearch-jdbc- ...
- Docker 下Elasticsearch 的安装 和ik分词器
(1)docker镜像下载 docker pull elasticsearch:5.6.8 (2)安装es容器 docker run -di --name=changgou_elasticsearch ...
- es(elasticsearch)安装IK中文分词器
IK压缩包下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.7.0,需要下载对应的版本 我也上传了 h ...
随机推荐
- gulp常用插件之gulp-notify使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-notify这是一款gulp通知插件. 更多使用文档请点击访问gulp-notify工具官网. 安装 一键安装不多解释 npm inst ...
- css使用padding-bottom百分比进行提前占位,防止抖动
页面加载抖动问题 在web开发中,经常会遇到这样一个问题,比如一个宽度百分百,高度自适应的图片,在网速慢的情况下加载过程中会出现抖动的问题(未加载图片前容器的高度为0,图片加载完成后下面的内容会被挤下 ...
- RBAC基于角色的权限管理模型
一.权限管理模型的必要性: a. 安全性:防止误操作,防止数据泄露,保证信息的安全. b. 数据隔离:保持不同的角色具有不同的权限,只能看到自己权限范围内的数据 二.权限管理模型的发展: a. 传统的 ...
- jsp虚拟路径与虚拟主机
配置虚拟路径 方式一: 在Tomcat根目录下的webapps就是一个虚拟路径,conf目录下的server.xml文件里配置 //默认的虚拟路径 <Engine name="Cata ...
- 带你快速了解Linux文件系统
http://www.embeddedlinux.org.cn/emb-linux/file-system/201807/03-8197.html 这篇教程将帮你快速了解 Linux 文件系统. 早在 ...
- [AFO]离开,未尝不是一个新的开始
2019年5月18日 我注册了洛谷,提交了我的第一份AC代码-- A+B Problem 11月16日-17日 在短短6个月的仓促学习后,我从OI零基础走到了CSP-S的考场上 同年11月26日 在与 ...
- nat123+nginx实现外网访问本机IIS发布的系统
故事开端(前因) 嗯,内网其实是校园网络,服务器呢,不是阿里云.腾讯云之类的云服务器,而是自己正在码字的笔记本电脑:有公网IP吗?没有!校园IP分配的IP固定不?不固定,动态分配的,额~~~. 我想想 ...
- 深入浅出Mybatis系列四-配置详解之typeAliases别名(mybatis源码篇)
注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(三)---配置详解之properties ...
- 375. 猜数字大小 II
题目: 链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/ 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 ...
- LVM实现将2块磁盘总空间“合二为一”并挂载到同一目录
需求场景 将MySQL主机的2块18T的数据盘空间全部"合并"后挂载到/mysql_data目录下,要求文件系统格式化为xfs:已有关键信息梳理如下: 需要挂载的数据盘 /dev/ ...