es 分词器详解

基本概念

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

分词器发生的时期

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"
}

感谢观看!!!感兴趣的小伙伴可以关注收藏,持续更新中!

相关推荐
我爱写代码?14 分钟前
MapReduce架构-打包运行
大数据·spark
MZWeiei1 小时前
Spark SQL 运行架构详解(专业解释+番茄炒蛋例子解读)
大数据·分布式·sql·架构·spark
Hadoop_Liang2 小时前
解决Mawell1.29.2启动SQLException: You have an error in your SQL syntax问题
大数据·数据库·maxwell
火龙谷3 小时前
【hadoop】Flume的相关介绍
大数据·hadoop·flume
Luck_ff08105 小时前
Elasticsearch 快速入门指南
大数据·elasticsearch·搜索引擎
天天爱吃肉82185 小时前
大数据:新能源汽车宇宙的未来曲率引擎
大数据·汽车
言之。6 小时前
Makefile 在 Go 项目中的实践
开发语言·elasticsearch·golang
IvanCodes7 小时前
九、HQL DQL七大查询子句
大数据·数据库·hive
只因只因爆7 小时前
spark数据清洗
大数据·分布式·spark
好吃的肘子8 小时前
ElasticSearch进阶
大数据·开发语言·分布式·算法·elasticsearch·kafka·jenkins