2. ES 分析过程 - ik分词器安装
ES 分析过程
参考网址:https://www.cnblogs.com/Neeo/articles/10593037.html
当数据被发送到elasticsearch
后并加入到倒排索引之前,elasticsearch
会对该文档的进行一系列的处理步骤:
- 字符过滤:使用字符过滤器转变字符。
- 文本切分为分词:将文本(档)分为单个或多个分词。
- 分词过滤:使用分词过滤器转变每个分词。
- 分词索引:最终将分词存储在Lucene倒排索引中。
整体流程如下图所示:
![](E:\Python学习\11.搜索引擎-数据库进阶\day103 - es分析过程,python批量写入\1.bmp)
接下来,我们简要的介绍elasticsearch
中的分析器、分词器和分词过滤器
分析器 - analyzer
1.标准分析器(standard analyzer):是elasticsearch的默认分析器,该分析器综合了大多数欧洲语言来说合理的默认模块,包括标准分词器、标准分词过滤器、小写转换分词过滤器和停用词分词过滤器。
2.简单分析器(simple analyzer):简单分析器仅使用了小写转换分词,这意味着在非字母处进行分词,并将分词自动转换为小写
3.空白(格)分析器(whitespace analyzer):这玩意儿只是根据空白将文本切分为若干分词,真是有够偷懒!
4.停用词分析(stop analyzer)和简单分析器的行为很像,只是在分词流中额外的过滤了停用词
5.模式分析器(pattern analyzer)允许我们指定一个分词切分模式。但是通常更佳的方案是使用定制的分析器,组合现有的模式分词器和所需要的分词过滤器更加合适。
6.语言和多语言分析器:chinese -- 对中文不太友好
7.雪球分析器(snowball analyzer)除了使用标准的分词和分词过滤器(和标准分析器一样)也是用了小写分词过滤器和停用词过滤器,除此之外,它还是用了雪球词干器对文本进行词干提取。
# 测试 标准分词器
POST _analyze
{
"analyzer": "standard",
"text": "To be or not to be, That is a question ———— 莎士比亚"
}
# 简单分词器
POST _analyze
{
"analyzer": "simple",
"text":"To be or not to be, That is a question ———— 莎士比亚"
}
字符过滤器
字符过滤器在<charFilter>
属性中定义,它是对字符流进行处理。字符过滤器种类不多。elasticearch只提供了三种字符过滤器:
- HTML字符过滤器(HTML Strip Char Filter)
- 映射字符过滤器(Mapping Char Filter)
- 模式替换过滤器(Pattern Replace Char Filter)
HTML字符过滤器
HTML字符过滤器(HTML Strip Char Filter)从文本中去除HTML元素
POST _analyze
{
"tokenizer": "keyword",
"char_filter": ["html_strip"],
"text":"<p>I'm so <b>happy</b>!</p>"
}
映射字符过滤器
映射字符过滤器(Mapping Char Filter)接收键值的映射,每当遇到与键相同的字符串时,它就用该键关联的值替换它们。
PUT pattern_test4
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer":{
"tokenizer":"keyword",
"char_filter":["my_char_filter"]
}
},
"char_filter":{
"my_char_filter":{
"type":"mapping",
"mappings":["苍井空 => 666","武藤兰 => 888"]
}
}
}
}
}
上例中,我们自定义了一个分析器,其内的分词器使用关键字分词器,字符过滤器则是自定制的,将字符中的苍井空替换为666,武藤兰替换为888。
POST pattern_test4/_analyze
{
"analyzer": "my_analyzer",
"text": "苍井空热爱武藤兰,可惜后来苍井空结婚了"
}
模式替换过滤器
模式替换过滤器(Pattern Replace Char Filter)使用正则表达式匹配并替换字符串中的字符。但要小心你写的抠脚的正则表达式。因为这可能导致性能变慢!
PUT pattern_test5
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_char_filter"
]
}
},
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern": "(\\d+)-(?=\\d)",
"replacement": "$1_"
}
}
}
}
}
上例中,我们自定义了一个正则规则。
POST pattern_test5/_analyze
{
"analyzer": "my_analyzer",
"text": "My credit card is 123-456-789"
}
分词器
由于elasticsearch内置了分析器,它同样也包含了分词器。分词器,顾名思义,主要的操作是将文本字符串分解为小块,而这些小块这被称为分词token
。
1.标准分词器(standard tokenizer):是一个基于语法的分词器,对于大多数欧洲语言来说还是不错的
2.关键词分词器(keyword tokenizer)是一种简单的分词器,将整个文本作为单个的分词,提供给分词过滤器,当你只想用分词过滤器,而不做分词操作时,它是不错的选择。
3.字母分词器(letter tokenizer)根据非字母的符号,将文本切分成分词
4.空白分词器(whitespace tokenizer)通过空白来分隔不同的分词,空白包括空格、制表符、换行等。但是,我们需要注意的是,空白分词器不会删除任何标点符号。
5.模式分词器(pattern tokenizer)允许指定一个任意的模式,将文本切分为分词。
.......等等
# 测试
POST _analyze
{
"tokenizer": "standard",
"text":"To be or not to be, That is a question ———— 莎士比亚"
}
IK分词器插件的安装
参考网址:https://www.cnblogs.com/Neeo/articles/10613793.html
下载
打开Github
官网,搜索elasticsearch-analysis-ik
,单击medcl/elasticsearch-analysis-ik
![1620652709783](E:\Python学习\11.搜索引擎-数据库进阶\day103 - es分析过程,python批量写入\assets\1620652709783.png)
选择与es一样的版本下载,
安装
首先打开C:\Program Files\elasticseach-6.5.4\plugins
es安装插件目录,新建一个名为ik
的子目录,并将elasticsearch-analysis-ik-6.5.4.zip
包解压到该ik
目录内,就可以用了
ik_smart: 该参数将文档作最粗粒度的拆分
ik_max_word 该参数将文档作最细粒度的拆分
第一个ik示例
GET _analyze
{
"analyzer": "ik_max_word",
"text": "上海自来水来自海上"
}
建立索引,指定分词器
PUT ik1
{
"mappings": {
"doc": {
"dynamic": false,
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
ik中的短语查询参照之前的短语查询即可。
GET ik1/_search
{
"query": {
"match_phrase": {
"content": "今天"
}
}
}
ik之短语前缀查询
GET ik1/_search
{
"query": {
"match_phrase_prefix": {
"content": {
"query": "今天好日子",
"slop": 2
}
}
}
}