基本概念
分词器官方称之为文本分析器,顾名思义,是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。
分词器发生的时期
1、分词器的处理过程发生在索引文档创建时期
2、搜索时期,对搜索词进行分词
分词器的组成
- 切词器(Tokenizer):用于定义切词(分词)逻辑
- 词项过滤器(Token Filter):用于对分词之后的单个词项的处理逻辑
- 字符过滤器(Character Filter):用于处理单个字符
注意:分词器不会对源数据产生影响,分词只是对倒排索引以及搜索词的行为
切词器:Tokenizer
tokenizer 是分词器的核心组成部分之一,其主要作用是分词,或称之为切词。主要用来对原始文本进行细粒度拆分。拆分之后的每一个部分称之为一个 Term,或称之为一个词项。可以把切词器理解为预定义的切词规则。官方内置了很多种切词器,默认的切词器为 standard。
词项过滤器:Token Filter
词项过滤器用来处理切词完成之后的词项,例如把大小写转换,删除停用词或同义词处理等。官方同样预置了很多词项过滤器,基本可以满足日常开发的需要。当然也是支持第三方也自行开发的。
比如转为大写:
转为小写:
#转为大写
GET _analyze
{"tokenizer": "standard", "filter": ["uppercase"],"text": ["www elastic co guide"]
}#转为小写
GET _analyze
{"tokenizer": "standard","filter": ["lowercase"],"text": ["WWW ELASTIC CO GUIDE"]
}
停用词
在切词完成之后,会被干掉词项,即停用词。停用词可以自定义
在分词器插件的配置文件中可以看到停用词的定义
比如 ik 分词器定义的停用词如下
演示:
可以看到 are 被停用了
# 停用词
GET _analyze
{"tokenizer": "standard","filter": ["stop"], "text": ["what are you doing"]
}
也可以自定义停用词:
### 自定义 filter
PUT test_token_filter_stop
{"settings": {"analysis": {"filter": {"my_filter": {"type": "stop","stopwords": ["www"],"ignore_case": true}}}}
}
GET test_token_filter_stop/_analyze
{"tokenizer": "standard", "filter": ["my_filter"], "text": ["What www WWW are you doing"]
}
同义词
同义词定义规则
- a, b, c => d:这种方式,a、b、c 会被 d 代替。
- a, b, c, d:这种方式下,a、b、c、d 是等价的。
#同义词
PUT test_token_filter_synonym
{"settings": {"analysis": {"filter": {"my_synonym": {"type": "synonym","synonyms": ["good, nice => excellent"]}}}}
}GET test_token_filter_synonym/_analyze
{"tokenizer": "standard", "filter": ["my_synonym"], "text": ["good"]
}
字符过滤器:Character Filter
分词之前的预处理,过滤无用字符。
html 标签过滤器
type:html_strip 表示过滤 html 标签
escaped_tags: 表示需要保留的标签
下面示例,可以看到 p 标签被过滤,而 a 标签保留
#字符过滤器
PUT test_html_strip_filter
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "html_strip","escaped_tags": ["a"]}}}}
}GET test_html_strip_filter/_analyze
{"tokenizer": "standard","char_filter": ["my_char_filter"],"text": ["<p>I'm so <a>happy</a>!</p>"]
}
字符映射过滤器:Mapping Character Filter
通过定义映替换为规则,把特定字符替换为指定字符
"type": "mapping" 表示字符映射
mappings 里面配置需要映射的字符关系
PUT test_html_strip_filter
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "mapping", "mappings": [ "大 => *","可 => *","爱 => *"]}}}}
}
GET test_html_strip_filter/_analyze
{"char_filter": ["my_char_filter"],"text": "你就是一个大可爱"
}
正则替换过滤器:Pattern Replace Character Filter
"type": "pattern_replace" 表示正则替换
#正则替换
PUT text_pattern_replace_filter
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "pattern_replace", "pattern": """(\d{3})\d{4}(\d{4})""", "replacement": "$1****$2"}}}}
}
GET text_pattern_replace_filter/_analyze
{"char_filter": ["my_char_filter"],"text": "您的手机号是18868686688"
}
感谢观看!!!感兴趣的小伙伴可以关注收藏,持续更新中!