首页 > 其他分享 >Elasticsearch 学习- 分片原理,倒排索引,文档搜索,文档分析,内置分析器,指定分词器,IK分词器

Elasticsearch 学习- 分片原理,倒排索引,文档搜索,文档分析,内置分析器,指定分词器,IK分词器

时间:2023-04-02 15:14:32浏览次数:49  
标签:词条 倒排 分析器 索引 文档 分词器 offset

Elasticsearch 学习- 分片原理

4.6 分片原理

​ 分片是 Elasticsearch 最小的工作单元。但是究竟什么是一个分片,它是如何工作的?

​ 传统的数据库每个字段存储单个值,但这对全文检索并不够。文本字段中的每个单词需要被搜索,对数据库意味着需要单个字段有索引多值的能力。最好的支持是一个字段多个值需求的数据结构是倒排索引。

4.6.1 倒排索引

​ Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索。

​ 见其名,知其意,有倒排索引,肯定会对应有正向索引。正向索引(forward index),反向索引(inverted index)更熟悉的名字是倒排索引。

​ 所谓的正向索引,就是搜索引擎会将待搜索的文件都对应一个文件 ID,搜索时将这个ID 和搜索关键字进行对应,形成 K-V 对,然后对关键字进行统计计数

​ 但是互联网上收录在搜索引擎中的文档的数目是个天文数字,这样的索引结构根本无法满足实时返回排名结果的要求。所以,搜索引擎会将正向索引重新构建为倒排索引,即把文件ID对应到关键词的映射转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,这些文件中都出现这个关键词。

一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。例如,假设我们有两个文档,每个文档的 content 域包含如下内容:

 The quick brown fox jumped over the lazy dog
 Quick brown foxes leap over lazy dogs in summer

为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条或 tokens ),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:

现在,如果我们想搜索quick brown ,我们只需要查找包含每个词条的文档:

两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用仅计算匹配词条数量的简单相似性算法,那么我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。

但是,我们目前的倒排索引有一些问题:

 Quick 和 quick 以独立的词条出现,然而用户可能认为它们是相同的词。
 fox 和 foxes 非常相似, 就像 dog 和 dogs ;他们有相同的词根。
 jumped 和 leap, 尽管没有相同的词根,但他们的意思很相近。他们是同义词。

​ 使用前面的索引搜索 +Quick +fox 不会得到任何匹配文档。(记住,+ 前缀表明这个词必须存在。)只有同时出现 Quick 和 fox 的文档才满足这个查询条件,但是第一个文档包含quick fox ,第二个文档包含 Quick foxes 。

​ 我们的用户可以合理的期望两个文档与查询匹配。我们可以做的更好。如果我们将词条规范为标准模式,那么我们可以找到与用户搜索的词条不完全一致,但具有足够相关性的文档。例如:

 Quick 可以小写化为 quick 。
 foxes 可以 词干提取 --变为词根的格式-- 为 fox 。类似的, dogs 可以为提取为 dog 。
 jumped 和 leap 是同义词,可以索引为相同的单词 jump 。

这还远远不够。我们搜索 +Quick +fox 仍然 会失败,因为在我们的索引中,已经没有 Quick 了。但是,如果我们对搜索的字符串使用与 content 域相同的标准化规则,会变成查询+quick +fox,这样两个文档都会匹配!分词和标准化的过程称为分析这非常重要。你只能搜索在索引中出现的词条,所以索引文本和查询字符串必须标准化为相同的格式。

4.6.2 文档搜索

早期的全文检索会为整个文档集合建立一个很大的倒排索引并将其写入到磁盘。 一旦新的索引就绪,旧的就会被其替换,这样最近的变化便可以被检索到。

倒排索引被写入磁盘后是 不可改变 的:它永远不会修改。

不变性有重要的价值:

 不需要锁。如果你从来不更新索引,你就不需要担心多进程同时修改数据的问题。

 一旦索引被读入内核的文件系统缓存,便会留在哪里,由于其不变性。只要文件系统缓存中还有足够
的空间,那么大部分读请求会直接请求内存,而不会命中磁盘。这提供了很大的性能提升。

 其它缓存(像 filter 缓存),在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建,因为
数据不会变化。

 写入单个大的倒排索引允许数据被压缩,减少磁盘 I/O 和 需要被缓存到内存的索引的使用量。

当然,一个不变的索引也有不好的地方。主要事实是它是不可变的! 你不能修改它。如
果你需要让一个新的文档 可被搜索,你需要重建整个索引。这要么对一个索引所能包含的
数据量造成了很大的限制,要么对索引可被更新的频率造成了很大的限制。

4.7 文档分析

分析 包含下面的过程:

 将一块文本分成适合于倒排索引的独立的 词条

 将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall

分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里:

 字符过滤器
	首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉 HTML,或者将 & 转化成 and。
 分词器
	其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
 Token 过滤器
	最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化Quick ),删除词条(例如, 像 a, and, the 等无用词),或者增加词条(例如,像 jump 和 leap 这种同义词)。

4.7.1 内置分析器

Elasticsearch 还附带了可以直接使用的预包装的分析器。接下来我们会列出最重要的分析器。为了证明它们的差异,我们看看每个分析器会从下面的字符串得到哪些词条:

"Set the shape to semi-transparent by calling set_trans(5)"

 标准分析器
	标准分析器是 Elasticsearch 默认使用的分析器。它是分析各种语言文本最常用的选择。它根据 Unicode 联盟 定义的 单词边界 划分文本。删除绝大部分标点。最后,将词条小写。
	它会产生:
		set, the, shape, to, semi, transparent, by, calling, set_trans, 5
 简单分析器
	简单分析器在任何不是字母的地方分隔文本,将词条小写。它会产生:
		set, the, shape, to, semi, transparent, by, calling, set, trans
 空格分析器
	空格分析器在空格的地方划分文本。它会产生:
		Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
 语言分析器
	特定语言分析器可用于 很多语言。它们可以考虑指定语言的特点。例如, 英语 分析器附带了一组英语无用词(常用单词,例如 and 或者 the ,它们对相关性没有多少影响),它们会被删除。 由于理解英语语法的规则,这个分词器可以提取英语单词的 词干 。英语 分词器会产生下面的词条:
		set, shape, semi, transpar, call, set_tran, 5
注意看 transparent、 calling 和 set_trans 已经变为词根格式

4.7.2 分析器使用场景

当我们 索引 一个文档,它的全文域被分析成词条以用来创建倒排索引。 但是,当我们在全文域 搜索 的时候,我们需要将查询字符串通过 相同的分析过程 ,以保证我们搜索的词条格式与索引中的词条格式一致。全文查询,理解每个域是如何定义的,因此它们可以做正确的事:

 当你查询一个 全文 域时, 会对查询字符串应用相同的分析器,以产生正确的搜
索词条列表。
 当你查询一个 精确值 域时,不会分析查询字符串,而是搜索你指定的精确值。

4.7.3 测试分析器

有些时候很难理解分词的过程和实际被存储到索引中的词条,特别是你刚接触Elasticsearch。为了理解发生了什么,你可以使用 analyze API 来看文本是如何被分析的。在消息体里,指定分析器和要分析的文本

GET http://localhost:9200/_analyze
{
 "analyzer": "standard",
 "text": "Text to analyze"
}

结果中每个元素代表一个单独的词条:

{
	 "tokens": [
 		{
 			"token": "text",
 			"start_offset": 0,
 			"end_offset": 4,
 			"type": "<ALPHANUM>",
 		"position": 1
 },
 {
 	"token": "to",
 	"start_offset": 5,
 	"end_offset": 7,
 	"type": "<ALPHANUM>",
	 "position": 2
 },
 {
 	"token": "analyze",
 	"start_offset": 8,
 	"end_offset": 15,
 	"type": "<ALPHANUM>",
	 "position": 3
 	}
 	]
}

token 是实际存储到索引中的词条。 position 指明词条在原始文本中出现的位置。start_offset 和 end_offset 指明字符在原始字符串中的位置。

4.7.4 指定分析器

当Elasticsearch在你的文档中检测到一个新的字符串域,它会自动设置其为一个全文 字符串 域,使用 标准 分析器对它进行分析。你不希望总是这样。可能你想使用一个不同的分析器,适用于你的数据使用的语言。有时候你想要一个字符串域就是一个字符串域—不使用分析,直接索引你传入的精确值,例如用户 ID 或者一个内部的状态域或标签。要做到这一点,我们必须手动指定这些域的映射。

4.7.5 IK 分词器

首先我们通过 Postman 发送 GET 请求查询分词效果

# GET http://localhost:9200/_analyze
{
	"text":"测试单词"
}

ES 的默认分词器无法识别中文中测试、单词这样的词汇,而是简单的将每个字拆完分为一个词

{
 "tokens": [
 {
 "token": "测",
 "start_offset": 0,
 "end_offset": 1,
 "type": "<IDEOGRAPHIC>",
 "position": 0
 },
 {
 "token": "试",
 "start_offset": 1,
 "end_offset": 2,
 "type": "<IDEOGRAPHIC>",
 "position": 1
 },
 {
 "token": "单",
 "start_offset": 2,
 "end_offset": 3,
 "type": "<IDEOGRAPHIC>",
 "position": 2
 },
 {
 "token": "词",
 "start_offset": 3,
 "end_offset": 4,
 "type": "<IDEOGRAPHIC>",
 "position": 3
 }
 ]
}

这样的结果显然不符合我们的使用要求,所以我们需要下载 ES 对应版本的中文分词器。

我们这里采用 IK 中文分词器,下载地址为:

https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0

将解压后的后的文件夹放入 ES 根目录下的 plugins 目录下,重启 ES 即可使用。

我们这次加入新的查询参数"analyzer":"ik_max_word"

# GET http://localhost:9200/_analyze
{
"text":"测试单词",
"analyzer":"ik_max_word"
}
 ik_max_word:会将文本做最细粒度的拆分
 ik_smart:会将文本做最粗粒度的拆分

使用中文分词后的结果为:

{
	 "tokens": [
 	{
		 "token": "测试",
		 "start_offset": 0,
 		"end_offset": 2,
 		"type": "CN_WORD",
 		"position": 0
 },
 {
 		"token": "单词",
 		"start_offset": 2,
 		"end_offset": 4,
 		"type": "CN_WORD",
 		"position": 1
		 }
	 ]
}

ES 中也可以进行扩展词汇,首先查询

# GET http://localhost:9200/_analyze
{
"text":"弗雷尔卓德",
"analyzer":"ik_max_word"
}

仅仅可以得到每个字的分词结果,我们需要做的就是使分词器识别到弗雷尔卓德也是一个词语

{
	 "tokens": [
 	{
 	 "token": "弗",
 "start_offset": 0,
 "end_offset": 1,
 "type": "CN_CHAR",
 "position": 0
 },
 {
 "token": "雷",
 "start_offset": 1,
 "end_offset": 2,
 "type": "CN_CHAR",
 "position": 1
 },
 {
 "token": "尔",
 "start_offset": 2,
 "end_offset": 3,
 "type": "CN_CHAR",
 "position": 2
 },
 {
 "token": "卓",
 "start_offset": 3,
 "end_offset": 4,
 "type": "CN_CHAR",
 "position": 3
 },
 {
 "token": "德",
 "start_offset": 4,
 "end_offset": 5,
 "type": "CN_CHAR",
 "position": 4
 }
 ]
}

首先进入 ES 根目录中的 plugins 文件夹下的 ik 文件夹,进入 config 目录,创建 custom.dic文件,写入弗雷尔卓德。同时打开 IKAnalyzer.cfg.xml 文件,将新建的 custom.dic 配置其中,重启 ES 服务器。

标签:词条,倒排,分析器,索引,文档,分词器,offset
From: https://www.cnblogs.com/atao-BigData/p/17280495.html

相关文章

  • Elasticsearch 学习-Elasticsearch进阶-索引,文档,字段,映射,分片,副本,分配,系统架构,分片控
    Elasticsearch学习-Elasticsearch进阶4.1核心概念4.1.1索引(Index)​ 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个......
  • 软件测试经验与教训之测试文档和与程序员交互
    测试文档的核心需求:1.测试文档主要支持我们找出这个产品版本中的程序错误,指派工作和跟踪工作状态2.测试文档为新测试小组成员提供培训材料,让新成员快速的了解产品测试文档模板的优点是以标准组织形式,涵盖一组标准化的问题,并使用标准术语,这样会使人更容易理解但是测试模板有时......
  • yapi文档使用说明记录
    yapi文档地址:http://192.168.0.97:3000/    在idea下载插件:easy-yapi  配置插件 在 Settings->Other Settings -> EasyAPI 中的 **server **栏中填写服务器地址:http://yapi.gwm.cn/在 Settings->Other Settings -> EasyAPI 的 **tokens **......
  • 自动生成接口文档coreapi的使用
    1.安装coreapi  2.路由中配置路由固定格式   3.视图类自动生成接口文档第一种_单一方法的视图   4.第二种_包含多个方法的视图_在类视图的文档字符串中_分开方法定义   5.生成接口文档的setting和路由配置   5_1.生成接口文档的setting......
  • 项目一众筹网05_02_[树形开发]菜单管理、API文档发布到web服务器、配置文件里面修改to
    系列文章目录文章目录系列文章目录08-页面显示树形结构-前端-使用真实数据09-准备zTree的API文档(因为现在没有图标)==API文档发布到web服务器上去==配置文件里面修改tomcat的默认端口号(只需改动3个地方)10-前端-显示图标-分析思路(-页面显示树形结构)11-前端-显示图标-代码实现(-页面......
  • mongodb--文档查询
    一、简单查询--查询所有文档db.COLLECTION_NAME.find()--将查询结果以json形式显示db.COLLECTION_NAME.find().pretty()二、按条件查询文档db.COLLECTION_NAME.find(query,projection)参数说明:query:可选,projection:可选,查询时返回文档中所有键值,(默认省略)说明:按条件......
  • mongodb-文档的插入、更新与删除操作
    一、文档的插入--单文档插入db.COLLECTION_NAME.insert(document)db.COLLECTION_NAME.insertOne(document)--insert也可以插入多文档db.COLLECTION_NAME.save(document)--insert与save区别--insert方法插入若文档中已存在该文档,会报错,反之写入--save方法插入若集合中已......
  • 如何当个优秀的文档工程师?从 TC China 看技术文档工程师的自我修养
    本文系NebulaGraphCommunityAcademic技术文档工程师Abby的参会观感,讲述了她在中国技术传播大会分享的收获以及感悟。据说,技术内容领域、传播领域的专家和决策者们会在中国技术传播大会「tcworldChina2022」大会上分享心得。作为一名技术文档工程师,本着了解相关行业的......
  • 文档
    groupadd elsearchuseradd elsearch -g elsearch -p codingwhychown-Relsearch:elsearchelasticsearch-7.9.3suelsearch./elasticsearch -d解决办法:1、在config文件夹下找到elasticsearch.yml文件,找到network.host:ip,注释掉这句,然后新增network.bind_host:0.0.0......
  • 谷歌Chrome浏览器内直接打开编辑保存Office Word、Excel、PPT 文档,可离线部署!
    谷歌Chrome经过开发团队不断优化,凭借运行界面简单,打开速度最快及扩展插件众多,Chrome已经成为了世界上最受欢迎的浏览器。不过有一点非常可惜,由于微软Office不是开源程序,所以Chrome一直无法直接打开微软Office文档。虽然后来有一些国内厂商通过调用微软免费开源的ActiveX控件DsoFr......