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

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

相关推荐
搞程序的心海3 分钟前
Flink DataStream API深度解析(Scala版):窗口计算、水位线与状态编程
大数据·flink·scala
得物技术1 小时前
如何合理规划Elasticsearch的索引|得物技术
elasticsearch
我爱布朗熊1 小时前
5.Elasticsearch - Spring Data 框架
spring·elasticsearch·jenkins
Debug_TheWorld2 小时前
Hbase学习
大数据·hbase
阿里云大数据AI技术3 小时前
阿里云 Elasticsearch Serverless 检索增强型8.17版免费邀测!
大数据·elasticsearch
人工干智能3 小时前
科普:如何通过ROC曲线,确定二分类的“理论阈值”
大数据·人工智能·分类
小张童鞋。3 小时前
MapReduce实验:分析和编写WordCount程序(对文本进行查重)
大数据·mapreduce
孟意昶3 小时前
大数据面试问答-Spark
大数据·面试·spark
TDengine (老段)3 小时前
TDengine 语言连接器(Go)
大数据·数据库·物联网·golang·时序数据库·tdengine·iotdb
JZC_xiaozhong4 小时前
制造企业如何通过实现数据统一?
大数据·spring boot·后端·制造·mdm·主数据管理·数据集成与应用集成