ElasticSearch漫游 (2.认识分词器)

分词器

上一篇中我们专门安装了一个分词器。

什么是分词器呢??

来一段chatgpt的形象解释:

在 Elasticsearch (ES) 中,分词器(Tokenizer)是用于将文本字符串分割成单词(或称为词条)的组件。它是文本分析过程中的第一步,将原始文本转换为可被索引和搜索的离散单元。

分词器接收一个文本字符串作为输入,并将其拆分成一个个单词或词条,通常根据一定的规则进行分割。这些规则可以是基于空格、标点符号、数字等进行分隔,或者根据语言特定的规则进行断句和词干提取。

以下是一个简单的例子,展示如何使用 ES 的标准分词器(Standard Tokenizer)来分析一个句子:

假设我们有以下输入文本:"Elasticsearch is a powerful search engine."

使用标准分词器对该文本进行分析,它会按照默认规则进行分割,得到以下单词列表:

Elasticsearch
is
a
powerful
search
engine
通过分词器的处理,我们将原始文本转换成了可被索引和搜索的离散单元。这意味着我们可以根据这些单词来构建倒排索引,从而实现高效的全文搜索和相关性排名。

需要注意的是,ES 中的分词器还可以根据需求进行自定义配置。除了标准分词器,ES 还提供了其他类型的分词器,如简单分词器(Simple Tokenizer)、正则表达式分词器(Pattern Tokenizer)等,可以根据不同的场景和语言特性选择适合的分词器。

在上面的标准分词器 它分英文 分的相当好。

但是成中文呢?

我们动手试一下:

POST /_analyze
{
  "text": "太难了 人族就没法打",
  "analyzer": "standard"
}

分出来的结果是

{
  "tokens" : [
    {
      "token" : "太",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "难",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "了",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "人",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "族",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    },
    {
      "token" : "就",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "<IDEOGRAPHIC>",
      "position" : 5
    },
    {
      "token" : "没",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "<IDEOGRAPHIC>",
      "position" : 6
    },
    {
      "token" : "法",
      "start_offset" : 8,
      "end_offset" : 9,
      "type" : "<IDEOGRAPHIC>",
      "position" : 7
    },
    {
      "token" : "打",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "<IDEOGRAPHIC>",
      "position" : 8
    }
  ]
}

发现没有 标准分词器 不认识中文 只能一个一个字的拆。
所以我们在上一篇的安装过程中 安装了ik分词器

这里重点来了!
ik分词器有两种 要理解他们的区别:

  • ik_smart 最少切分
  • ik_max_word 最细切分

这两个东西很抽象 我写博客的时候 一时间找不到合适的语言表达。

我们还是动手实践一下 看看结果最靠谱:

对比一下上面的例子

POST /_analyze
{
  "text": "太难了 人类就没法打",
  "analyzer": "ik_smart"
}

{
  "tokens" : [
    {
      "token" : "太",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "难了",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "人类",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "就",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
      "token" : "没法",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "打",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "CN_CHAR",
      "position" : 5
    }
  ]
}

感受到变化了没有。它认识一点中文了 比如人类 ,太难了。

新手可能会好奇 那你分这个词意义在哪里呢????

意义就在于/ 我分出来 人类 没法 难了 这三个词

意味着 我用这三个词 就能搜索出 “text”: “太难了 人类就没法打”, 这段文本。


拓展

思考两个问题

  • 随着社会变化 会出现不断的新词 比如奥里给 比如白嫖 比如只因你太美,这些词汇分词器不认识 这时候怎么办呢?

    分词器允许你拓展字典 词汇。

  • 咱们国家有些敏感词是不能出现的 你懂的, 这个怎么办?
    分词器允许你屏蔽一些 词汇

这些拓展和屏蔽的词 只需要在ik分词器目录中的 xml文件中配置就好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值