Elasticsearch之文档分析

好记性不如烂笔头,感谢尚硅谷的资料,Thanks♪(・ω・)ノ O(∩_∩)O哈哈~

1.分析器

分析包含下面的过程:

  • 将一块文本分成适合于倒排索引的词条
  • 将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recal
    分析器执行上面的工作。

分析器实际上是将三个功能封装到了一个包里:
1.字符过滤器
首先,字符串按顺序通过每个字符过滤器。它们的任务是在分词前整理字符串。一个字符串过滤器可以用来去掉 HTML,或者将 & 转化成 and。
2.分词器
其次,字符串被分词器分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
3.Token过滤器
最后,词条按顺序通过每个 token 过滤器。这个过程可能会改变词条(例如:将大写字母小写化),删除词条(例如:a,and,the 等无用词),或者增加词条(例如:jump 和 leap 这种同义词)

2.内置分析器

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

3.分析器使用场景

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

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

4.测试分析器

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

在这里插入图片描述

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

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

4.指定分析器

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

5.IK分词器

首先我们通过 APIPost 发送 GET 请求查询分词效果
在这里插入图片描述
ES 的默认分词器(标准分词器)无法识别中文中的“测试”、“单词”这样的词汇,而是简单的将每个字拆完分为一个词
在这里插入图片描述
这样的结果显然不符合我们的使用要求,所以我们需要下载 ES 对应版本的中文分词器。
我们这里采用 IK 中文分词器,下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0
将解压后的文件夹放入 ES 根目录下的 plugins 目录下,重启 ES 即可。
在这里插入图片描述

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

{
	"text": "测试单词",
	"analyzer": "ik_max_word"
}
  • ik_max_word:会将文本做最细粒度的拆分
  • ik_smart:会将文本做最粗粒度的拆分

使用中文分词器后的结果为:
在这里插入图片描述
ES 中也可以进行扩展词汇,首先查询

{
   "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 服务器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.自定义分析器

虽然 Elasticsearch 带有一些现成的分析器,然而在分析器上 Elasticsearch 真正的强大之处在于,我们可以通过在一个适合的特定数据的设置之中组合字符过滤器、分词器、Token过滤器来创建自定义的分析器。在上面我们说过,一个分析器就是一个包里面组合了三种函数的一个包装器,三种函数按照顺序被执行:
字符过滤器: 字符过滤器用来整理一个尚未被分词的字符串。例如:我们的文本是 HTML 格式的,它会包含像 <p> 或者<div>这样的 HTML 标签,这些标签,这些标签是我们不想索引的。我们可以使用 HTML 清除字符过滤器来移除所有的 HTML 标签,并且像把 &Aacute; 转换为相对应的 Unicode 字符 A 这样,转换 HTML 实体。一个分析器可能有 0 个或者多个字符过滤器。
分词器: 一个分析器必须有一个唯一的分词器。分词器把字符串分解成单个词条或者词汇单元。标准分析器使用的标准分词器把一个字符串根据单词边界分解成单个词条,并且移除大部分的标点符号,然而还有其他不同行为的分词器存在。
例如:关键词分词器完整地输出接收到的同样的字符串,并不做任何分词。空格分词器只根据空格分隔文本。正则分词器根据匹配正则表达式来分隔文本。
词单元过滤器: 经过分词,作为结果的词单元流会按照指定的顺序通过指定的词单元过滤器。词单元过滤器可以修改、添加或者删除词单元。我们已经提到过的 lowercase 和 stop 词过滤器,但是在 Elasticsearch 里面还有很多可供选择的词单元过滤器。词干过滤器把单词遏制为词干。ascii_folding 过滤器移除变音符,把一个像"très"这样的词转换为"tres"。ngram 和 edge_ngram 词单元过滤器可以产生适合用于部分匹配或者自动补全的词单元。
接下来,我们看看如何创建自定义的分析器,创建索引的时候我们可以自定义分析器:
在这里插入图片描述

{
	"settings": {
		"analysis": {【分析器配置】
			"char_filter": {【字符过滤器】
				"&_to_and": {【字符过滤器名称】
					"type": "mapping",【字符过滤器类型:映射】
					"mappings": ["&=> and "]【将&转换为and】
				}
			},
			"filter": {【词单元过滤器】
				"my_stopwords": {【词单元过滤器名称】
					"type": "stop",【词单元过滤器类型:移除类型】
					"stopwords": ["the", "a"]【移除的词】
				}
			},
			"analyzer": {【分析器】
				"my_analyzer": {【分析器名称】
					"type": "custom",【分析器类型】
					"char_filter": ["html_strip", "&_to_and"],【字符过滤器集合,按顺序过滤】
					"tokenizer": "standard",【分词器名称:标准分词器】
					"filter": ["lowercase", "my_stopwords"]【词单元过滤器集合,按顺序过滤】
				}
			}
		}
	}
}

索引被创建以后,使用 analyze API 来 测试这个新的分析器:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值