网站开发需要提供哪些东西,wordpress 图片分享主题,山东seo推广多少钱,俄语企业网站制作写在前面
本文看下es的倒排索引相关内容。
1#xff1a;正排索引和倒排索引
正排索引就是通过文档id找文档内容#xff0c;而倒排索引就是通过文档内容找文档id#xff0c;如下图#xff1a;
2#xff1a;倒排索引原理
假定我们有如下的数据#xff1a; 为了建立倒…写在前面
本文看下es的倒排索引相关内容。
1正排索引和倒排索引
正排索引就是通过文档id找文档内容而倒排索引就是通过文档内容找文档id如下图
2倒排索引原理
假定我们有如下的数据 为了建立倒排索引我们需要先对文档进行分词如下 分词后每一个词有一个专门的名词来表示叫做Termterm就是我们要搜索的目标但是找到了term并不能找到文档为了找到文档每一个term对应一个[文档id偏移量,出现次数]的数组这个数组我们叫做Posting List其中每个term对应一个Posing List如下图 为了方便查找termtermPosing List组合在字典的数据结构叫做Term Dictionary(注意term是排好序的所以可以顺序查找后面会用到)如下图 这样当我们搜索Elasticsearch,可以通过Term Disctionary查到对应的term然后通过term就可以找到对应的PosingList就找到文档了这个过程如下: 但实际上我们搜索的关键词是没有办法直接按照上述流程找到term的因为term dictionary比较大是保存在磁盘上的直接基于磁盘查找速度就可想而知了所以es还设计了另外一种数据结果term index用来在内存中保存关键词对应的term磁盘页位置term index是一种基于trie tree的数据结构大概如下图 其中红色的就是位置信息但是注意在term index中只会存储前缀所以可以定位到一个大概的位置而因为term是顺序存储的所以可以顺序读盘找到目标term这里我们简单的以直接定位到term为例看下这个过程 最后es为了能够将term index存储在内存中还是用了FST的算法来压缩空间。则最终查找过程就如下图了
以上过程分词是及其重要的一个环节所以我们接下来也来看下分词相关的内容。
3分词
3.1什么是分词和分词器
分词analysis即将一句话分为多个词term的过程。
分词器analyzer完成分词这个操作的工具。
如下图 所以分词是个动词分词器是个名词。
分词器在我们写入数据构建倒排索引的时候会用到在输入一句话进行搜索的时候也会用到。
3.2:分词器的工作原理
一个标准的分词器由以下三部分组成
Charancter Filters:对原始的内容进行处理如删除html字符等
Tokenizer:按照某种规则切分为一组单词term这部分功能不仅每种分词器都有而且还可能包含Token Filters的功能可以看作是分词器的非标准实现
Token Filters对切分后的次进行处理如转小写删除停用词等如下简单例子
注意这只是一个标准的分词器需要具备的三个部分但除了Tokennizer必须提供具体的实现外Chracter Filters和Token Filters并不是必须提供实现的。
3.3:分词器都有哪些 为了方便你我们查看不同的分词效果es提供了_analysis 的rest api如下
3.3.1Standard Analyzer
默认分词器标准分词器三部分提供如下:
charanter Filters:无
Tokennizer按词切分就是按照空格切分吧
Token Filters:小写处理如下图: 首先我们来看下standard analyzer的执行效果 可以看到只是空格划分后转小写了。 如果我们想要启动token fitlers中的停用词该怎么办呢可以这样我们来自定义一个分词器并指定配置因为在es中自定义分词需要定义在索引下所以我们需要指定索引来创建其实就是设置索引的setting,如下
PUT standard_analyzer_token_length_conf1_index
{settings: {analysis: {analyzer: {english_1analyzer:{type:standard,max_token_length:5,stopwords:_english_}}}}
}在索引standard_analyzer_token_length_conf1_index中我们定义了一个名称为english_1analyzer的自定义索引其中的配置项如下:
type:standard,基于standard分词器
max_token_length:5,token最大长度为5即如果term长度大于5则回分为2个如ABCDEFGHI会分为ABCDE和FGHI
stopwords:_english_使用标准的eglish停用词语也可以通过stopwords_path来指定停用词测试如下 可以看到is a这些就没了并且每个term的最大长度是5超过5的也被分成了多个。
3.3.2Simple Analyzer
简单分词器标准分词器三部分提供如下:
Charanter filters:不提供实现
Tokennizer按照非字母进行切分可对比standard分词器只按照空格进行切分然后还抢了本该属于Token Filters的活会转小写
Token filters不提供实现测试如下
3.3.3White space Analyzer
空格分词器标准分词器三部分提供如下
Character Filters:不提供实现
Tokenizer按照空格切分简单粗暴
Token Filters:不提供实现测试如下
3.3.4stop anylizer
停用词分词器标准分词器三部分提供如下
Character Filters:不提供实现
Tokenizer按照空格切分
Token Filters:删除is,a等修饰词可以看到相比于simple analyzer只是多了tokenfilters的删除修饰词功能。 测试如下
3.3.5keyword anylizer
关键词分词器标准分词器三部分提供如下
Charater Fitlers:不提供实现
Tokennizer原样输出也是一种特殊的分割不是嘛
Token Filters不提供实现测试如下
3.3.6Pattern anylizer
模式分词器标准分词器三部分提供如下
Character Fiters:不提供实现
Tokennizer默认按照\W进行分割即按照[09a-zA-Z_]之外的字符进行分割
Token Fiters:转小写以及停用词测试如下
3.3.7language anylizer
这并不是一个分词器而是一组分词器一组针对特定语言的分词器支持语言如下 以english为例看下其token filters还会将一些特定语态的单词变为正常的如xxxIng变为xxx,如
3.3.8中文分词
因为中华文字博大精深变化多端所以分词的难度相当之大具体点如下 为了测试中文分词我们可以来自定义一个安装了ik插件的新镜像参考docker自定义镜像并使用 。只需要将docker-compose中的es imga改成我们自己定义的就可以测试了如
3.3.9自定义分词器
https://blog.csdn.net/weixin_28906733/article/details/106610972 如果希望自定义一个与standard类似的analyzer,只需要在原定义
自定义一个与standard类似的analyzer 先再来看下standard分词器
charanter Filters:无
Tokennizer按词切分就是按照空格切分吧
Token Filters:小写处理定义和使用
//测试自定义analyzer
PUT custom_rebuild_standard_analyzer_index
{settings: {analysis: {analyzer: {rebuild_analyzer:{type:custom,tokenizer:standard,filter:[lowercase]}}}}
}//测试请求参数
POST custom_rebuild_standard_analyzer_index/_analyze
{text: transimission control protocol is a transport layer protocol
}自定义一个与simple类似的analyzer 先再来看下simple分词器
Charanter filters:不提供实现
Tokennizer按照非字母进行切分可对比standard分词器只按照空格进行切分然后还抢了本该属于Token Filters的活会转小写
Token filters不提供实现测试和使用
//测试自定义analyzer
PUT custom_rebuild_simple_analyzer_index
{settings: {analysis: {analyzer: {rebuild_simple:{tokenizer:lowercase,filter:[]}}}}
}//测试请求参数
POST custom_rebuild_simple_analyzer_index/_analyze
{text: transimission control protocol is a transport layer protocol
}写在后面
参考文章列表
Elasticsearch 学习笔记
Elasticsearch是如何做到快速索引的