如何理解Elasticsearch倒排索引与分词

技术如何理解Elasticsearch倒排索引与分词本篇内容主要讲解“如何理解Elasticsearch倒排索引与分词”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解E

本文主要讲解“如何理解Elasticsearch的倒排索引和分词”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习如何理解Elasticsearch的倒排索引和分词。

1 倒排索引

1.1 书的目录和索引

索引是目录页,根据页码找到内容。

如何理解Elasticsearch倒排索引与分词

倒排索引就是索引页,根据关键词找到对应的页码。

如何理解Elasticsearch倒排索引与分词

1.2 搜索引擎

正指数。

文档Id="文档内容和单词之间的相关性。

倒排索引

Word="文档Id关联。

左:正向索引=“右:反向索引”。

如何理解Elasticsearch倒排索引与分词

倒排索引查询流程

查询包含“搜索引擎”的文档。

倒排索引得到的‘搜索引擎’对应的文档Id为1和3。

通过正向索引查询1和3的完整内容。

返回最终结果。

1.3倒排指数的构成。

1.3.1 单词词典(Term Dictionary )

倒排索引的重要组成部分。

所有文档中记录的单词一般都很大。

将单词的关联信息记录到倒排表中。

字典一般用B树实现,示例如下。

如何理解Elasticsearch倒排索引与分词

1.3.2 倒排列表(Posting List )

记录单词对应的文档集,文档集由倒排索引项(过账)组成。

过账主要包含以下信息:

文档标识,用于获取原始信息。

词频(TF),记录该词在文档中的出现次数,用于后续的相关性计算。

位置(位置)

记录短语查询文档中的分词位置。

偏移

记录文档开头和结尾的单词以突出显示。

情况

以搜索引擎为例。

如何理解Elasticsearch倒排索引与分词

一种结构,在这种结构中,单词词典与倒排表结合在一起。

如何理解Elasticsearch倒排索引与分词

ES存储JSON格式的文档,其中包含多个字段,每个字段都有自己的倒排索引。

2 分词

将文本转换为一系列单词的过程,也称为文本分析,在es中称为。

Analysis。

2.1 Analyzer-分词器

分词器是 ES 专门处理分词的组件,组成如下:

2.1.1 Character Filters

在Tokenizer之前对原始文本进行处理,比如增加、删除或替换字符等。

针对原始文本进行处理,比如去除 html 特殊标记符,自带的如下:

  • HTML Strip 去除 html 标签和转换 html 实体

  • Mapping 进行字符替换操作

  • Pattern Replace 进行正则匹配替换

会影响后续tokenizer解析的postion和offset信息

如何理解Elasticsearch倒排索引与分词

2.1.2 Tokenizer

将原始文本按照一定规则切分为单词,内置:

  • standard 按单词进行分割

  • letter 按非字符类进行分割

  • whitespace 按空格进行分割

  • UAX URL Email 按 standard 分割,但不会分割邮箱和 url

  • NGram 和 Edge NGram 连词分割

  • Path Hierachy 按文件路径进行分割

示例:

POST _analyze{ "tokenizer":"path_hierarchy", "text":"/one/two/three"}

如何理解Elasticsearch倒排索引与分词

如何理解Elasticsearch倒排索引与分词

2.1.3 Token Filters

针对 tokenizer 处理的单词进行再加工,比如转小写、删除或新增等处理,内置:

  • lowercase 将所有 term 转换为小写

  • stop 删除 stop words

  • NGram 和 Edge NGram 连词分割

  • Synonym 添加近义词的 term

示例

// filter 可以有多个 POST _analyze {     "text":"a Hello world!",     "tokenizer":"standard",     "filter":[     "stop", // 把 a 去掉了     "lowercase",// 小写     {         "type":"ngram",         "min_gram":"4",         "max_gram":"4"     }     ] } // 得到 hell、ello、worl、orld

 如何理解Elasticsearch倒排索引与分词

分词器的调用顺序

如何理解Elasticsearch倒排索引与分词

3 Analyze API

ES 提供了一个测试分词的 API 接口,方便验证分词效果,endpoint 是 _analyze:

3.1 指定 analyzer

request

POST _analyze {     "analyzer":"standard", # 分词器     "text":" JavaEdge 公众号" # 测试文本 }

response

{   "tokens" : [     {       "token" : "java", # 分词结果       "start_offset" : 1, # 起始偏移       "end_offset" : 5, # 结束偏移       "type" : "<ALPHANUM>",       "position" : 0 # 分词位置     },     {       "token" : "edge",       "start_offset" : 6,       "end_offset" : 10,       "type" : "<ALPHANUM>",       "position" : 1     }   ] }

 如何理解Elasticsearch倒排索引与分词

3.2 指定索引中的字段

POST  测试的索引/_analyze   {     "field":"username", # 测试字段     "text":"hello world" # 测试文本 }

  如何理解Elasticsearch倒排索引与分词

3.3 自定义分词器

POST _analyze {     "tokenizer":"standard",     "filter":["lowercase"], # 自定义     "text":"hello world" }

之前的默认分词器大写

 如何理解Elasticsearch倒排索引与分词

自定义小写分词器

如何理解Elasticsearch倒排索引与分词

4 内置分词器

Standard Analyzer

默认分词器,按词切分,支持多语言,小写处理

Simple Analyzer

按照非字母切分,小写处理

如何理解Elasticsearch倒排索引与分词

Whitespace Analyzer

按空格切分

如何理解Elasticsearch倒排索引与分词

Stop Analyzer

Stop Word 指语气助词等修饰性词语,比如 the、an、的、这等等,特性是相比 Simple Analyzer 多 Stop Word  处理

  如何理解Elasticsearch倒排索引与分词

keyword Analyzer

不分词,直接将输入作为一个单词输出

 如何理解Elasticsearch倒排索引与分词

Pattern Analyzer

通过正则表达式自定义分隔符,默认 \W+,即非字词的符号为分隔符

如何理解Elasticsearch倒排索引与分词

Language Analyzer

提供了 30+ 常见语言的分词器

5 中文分词

将一个汉字序列切分成一个个单独的词。在英文中,单词之间是以空格作为自然分界符,汉语中词没有一个形式上的分界符。而且中文博大精深,上下文不同,分词结果也大不相同。

比如:

  • 乒乓球拍/卖/完了

  • 乒乓球/拍卖/完了

以下是 ES 中常见的分词系统:

IK

实现中英文单词的切分,可自定义词库,支持热更新分词词典

jieba

python 中最流行饿分词系统,支持分词和词性标注,支持繁体分词,自定义词典,并行分词

以下是基于自然语言处理的分词系统:

Hanlp

由一系列模型与算法组成的 java 工具包,支持索引分词、繁体分词、简单匹配分词(极速模式)、基于 CRF 模型的分词、N-  最短路径分词等,实现了不少经典分词方法。目标是普及自然语言处理在生产环境中的应用。

https://github.com/hankcs/HanLP

THULAC

  • THU Lexical Analyzer for Chinese ,由清华大学自然语言处理与社会人文计算

         实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能

          https://github.com/microbun/elasticsearch-thulac-plugin

6 自定义分词器

当自带的分词无法满足需求时,可以自定义分词器,通过定义 Character Filters、Tokenizer、Token Filter  实现。自定义的分词需要在索引的配置中设定,示例如下所示:

自定义如下分词器

如何理解Elasticsearch倒排索引与分词

// 自定义分词器 PUT test_index_name {   "settings":{      "analysis":{       "analyzer":{         "my_customer_analyzer":{           "type":"custome",           "tokenizer":"standard",           "char_filter":["html_strip"],           "filter":["lowercase", "asciifolding"]         }       }     }   } }  // 测试自定义分词器效果: POST test_index/_analyze {   "tokenizer":"keyword",   "char_filter":["html_strip"],   "text":"Is this <b>a box</b>?" }  // 得到 is、this、a、box

7 分词使用说明

分词会在如下两个时机使用:

创建或者更新文档时(Index Time)

会对相应的文档进行分词处理

索引时分词是通过配置Index Mapping中每个字段的analyzer属性实现的。不指定分词时,使用默认standard。

查询时(Search Time)

会对查询语句进行分词。查询时分词的指定方式:

  • 查询的时候通过analyzer指定分词器

  • 通过index mapping设置 search_analyzer 实现

分词的最佳实践

  • 明确字段是否需要分词,不需要分词的字段就将 type 设置为 keyword,可以节省空间和提高写性能。

  • 善用 _analyze API,查看文档的具体分词结果

  • 多动手测试

到此,相信大家对“如何理解Elasticsearch倒排索引与分词”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/43716.html

(0)

相关推荐

  • 家养狗狗排行榜,什么狗狗最适合在家里养

    技术家养狗狗排行榜,什么狗狗最适合在家里养最适合在家养的十大狗狗排名家庭里如果多了一位可爱的小成员的话家养狗狗排行榜,是可以改善整个家庭人员的情绪的。很多育儿专家认为,宠物作为孩子成长的小伙伴能够培养孩子的爱心,增强责任

    生活 2021年10月21日
  • 爱奇异vip黄金7天试用,爱奇艺黄金VIP卡怎么用啊

    技术爱奇异vip黄金7天试用,爱奇艺黄金VIP卡怎么用啊在用爱奇艺看电视、电影的时候,先登录,点开通会员,用卡开通,再输入卡号和密码就可以了爱奇异vip黄金7天试用。VIP开通方法: 第一步:登录爱奇艺会员中心,使用爱奇

    生活 2021年10月25日
  • Java SE 7文件操作中的路径操作是怎样的

    技术Java SE 7文件操作中的路径操作是怎样的Java SE 7文件操作中的路径操作是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获

    攻略 2021年11月21日
  • ESP32读取串口传感器数据

    技术ESP32读取串口传感器数据 ESP32读取串口传感器数据最近拿到一个九轴陀螺仪传感器,如图:该设备通过串口方式输出九轴数据,可用官方自带得上位机或者是sscom看到数据,官网提供了很多例程,但唯独

    礼包 2021年12月9日
  • 数学期望和方差公式,正态分布的数学期望和方差推导

    技术数学期望和方差公式,正态分布的数学期望和方差推导求期望数学期望和方差公式:ξ
    期望:Eξ=x1p1+x2p2+……+xnpn
    方差:s? 方差公式:s?1/n[(x1-x)?(x2-x)?……+(xn-x)瞉
    注:x

    生活 2021年10月23日
  • 10款好用的MySQL GUI工具分别是什么

    技术10款好用的MySQL GUI工具分别是什么这篇文章将为大家详细讲解有关10款好用的MySQL GUI工具分别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。My

    攻略 2021年11月29日