分词器
上一篇中我们专门安装了一个分词器。
什么是分词器呢??
来一段chatgpt的形象解释:
在 Elasticsearch (ES) 中,分词器(Tokenizer)是用于将文本字符串分割成单词(或称为词条)的组件。它是文本分析过程中的第一步,将原始文本转换为可被索引和搜索的离散单元。
分词器接收一个文本字符串作为输入,并将其拆分成一个个单词或词条,通常根据一定的规则进行分割。这些规则可以是基于空格、标点符号、数字等进行分隔,或者根据语言特定的规则进行断句和词干提取。
以下是一个简单的例子,展示如何使用 ES 的标准分词器(Standard Tokenizer)来分析一个句子:
假设我们有以下输入文本:"Elasticsearch is a powerful search engine."
使用标准分词器对该文本进行分析,它会按照默认规则进行分割,得到以下单词列表:
Elasticsearch
is
a
powerful
search
engine
通过分词器的处理,我们将原始文本转换成了可被索引和搜索的离散单元。这意味着我们可以根据这些单词来构建倒排索引,从而实现高效的全文搜索和相关性排名。
需要注意的是,ES 中的分词器还可以根据需求进行自定义配置。除了标准分词器,ES 还提供了其他类型的分词器,如简单分词器(Simple Tokenizer)、正则表达式分词器(Pattern Tokenizer)等,可以根据不同的场景和语言特性选择适合的分词器。
在上面的标准分词器 它分英文 分的相当好。
但是成中文呢?
我们动手试一下:
POST /_analyze
{
"text": "太难了 人族就没法打",
"analyzer": "standard"
}
分出来的结果是
{
"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" : 4,
"end_offset" : 5,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "族",
"start_offset" : 5,
"end_offset" : 6,
"type" : "<IDEOGRAPHIC>",
"position" : 4
},
{
"token" : "就",
"start_offset" : 6,
"end_offset" : 7,
"type" : "<IDEOGRAPHIC>",
"position" : 5
},
{
"token" : "没",
"start_offset" : 7,
"end_offset" : 8,
"type" : "<IDEOGRAPHIC>",
"position" : 6
},
{
"token" : "法",
"start_offset" : 8,
"end_offset" : 9,
"type" : "<IDEOGRAPHIC>",
"position" : 7
},
{
"token" : "打",
"start_offset" : 9,
"end_offset" : 10,
"type" : "<IDEOGRAPHIC>",
"position" : 8
}
]
}
发现没有 标准分词器 不认识中文 只能一个一个字的拆。
所以我们在上一篇的安装过程中 安装了ik分词器
这里重点来了!
ik分词器有两种 要理解他们的区别:
- ik_smart 最少切分
- ik_max_word 最细切分
这两个东西很抽象 我写博客的时候 一时间找不到合适的语言表达。
我们还是动手实践一下 看看结果最靠谱:
对比一下上面的例子
POST /_analyze
{
"text": "太难了 人类就没法打",
"analyzer": "ik_smart"
}
{
"tokens" : [
{
"token" : "太",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "难了",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "人类",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "就",
"start_offset" : 6,
"end_offset" : 7,
"type" : "CN_CHAR",
"position" : 3
},
{
"token" : "没法",
"start_offset" : 7,
"end_offset" : 9,
"type" : "CN_WORD",
"position" : 4
},
{
"token" : "打",
"start_offset" : 9,
"end_offset" : 10,
"type" : "CN_CHAR",
"position" : 5
}
]
}
感受到变化了没有。它认识一点中文了 比如人类 ,太难了。
新手可能会好奇 那你分这个词意义在哪里呢????
意义就在于/ 我分出来 人类 没法 难了 这三个词
意味着 我用这三个词 就能搜索出 “text”: “太难了 人类就没法打”, 这段文本。
拓展
思考两个问题
-
随着社会变化 会出现不断的新词 比如奥里给 比如白嫖 比如只因你太美,这些词汇分词器不认识 这时候怎么办呢?
分词器允许你拓展字典 词汇。
-
咱们国家有些敏感词是不能出现的 你懂的, 这个怎么办?
分词器允许你屏蔽一些 词汇
这些拓展和屏蔽的词 只需要在ik分词器目录中的 xml文件中配置就好了