热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

1 倒排索引

1.1 书的目录和索引

正排索引即目录页,根据页码去找内容

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

倒排索引即索引页,根据关键词去找对应页码

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

1.2 搜索引擎

  • 正排索引

        文档Id =》文档内容、单词的关联关系

  • 倒排索引

         单词 =》 文档Id的关联关系

  • 左:正排索引 =》 右:倒排索引

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

倒排索引查询流程

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

  1. 通过倒排索引获得"搜索引擎”对应的文档Id有1和3

  2. 通过正排索引查询1和3的完整内容

  3. 返回最终结果

1.3 倒排索引的组成

1.3.1 单词词典( Term Dictionary )

倒排索引的重要组成

  • 记录所有文档的单词 ,一般都比较大

  • 记录单词到倒排列表的关联信息

单词字典的实现一般是用B+ Tree ,示例如下

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

1.3.2 倒排列表( Posting List )

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

倒排索引项( Posting )主要包含如下信息:

  • 文档Id ,用于获取原始信息

  • 单词频率( TF, Term Frequency ),记录该单词在该文档中的出现次数,用于后续相关性算分

  • 位置( Position)

  • 记录单词在文档中的分词位置(多个) , 用于做词语搜索( Phrase Query )

  • 偏移( Offset )

记录单词在文档的开始和结束位置,用于做高亮显示

案例

以搜索引擎为例

如何理解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" : "",       "position" : 0 # 分词位置     },     {       "token" : "edge",       "start_offset" : 6,       "end_offset" : 10,       "type" : "",       "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 a box?" }  // 得到 is、this、a、box

7 分词使用说明

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

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

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

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

查询时(Search Time)

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

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

  • 通过index mapping设置 search_analyzer 实现

分词的最佳实践

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

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

  • 多动手测试

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


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 从批量eml文件中提取附件的Python代码实现方法
    本文介绍了使用Python代码从批量eml文件中提取附件的实现方法,包括获取eml附件信息、递归文件夹下所有文件、创建目的文件夹等步骤。通过该方法可以方便地提取eml文件中的附件,并保存到指定的文件夹中。 ... [详细]
author-avatar
凌子的夏天_952
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有