分词器官方称之为文本分析器,顾名思义,是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。

1、分词器的处理过程发生在索引文档创建时期
2、搜索时期,对搜索词进行分词
注意:分词器不会对源数据产生影响,分词只是对倒排索引以及搜索词的行为
tokenizer 是分词器的核心组成部分之一,其主要作用是分词,或称之为切词。主要用来对原始文本进行细粒度拆分。拆分之后的每一个部分称之为一个 Term,或称之为一个词项。可以把切词器理解为预定义的切词规则。官方内置了很多种切词器,默认的切词器为 standard。
词项过滤器用来处理切词完成之后的词项,例如把大小写转换,删除停用词或同义词处理等。官方同样预置了很多词项过滤器,基本可以满足日常开发的需要。当然也是支持第三方也自行开发的。
比如转为大写:

转为小写:

- #转为大写
- 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"]
- }
同义词定义规则

- #同义词
- 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"]
- }
分词之前的预处理,过滤无用字符。
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": ["
I'm so happy!
"] - }
通过定义映替换为规则,把特定字符替换为指定字符
"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": "你就是一个大可爱"
- }
"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"
- }
感谢观看!!!感兴趣的小伙伴可以关注收藏,持续更新中!