当前位置:网站首页 > 技术博客 > 正文

分词 搜索



前言

我们知道ElasticSearch(简称ES)底层的搜索使用的是倒排索引依赖于分词器的实现,那么分词器的规则可以如何制定、ES中都提供了哪些常用的分词器给我们去使用呢?本文将围绕分词器的使用和细节进行讲解,希望能够对想要了解ES分词器的小伙伴们一个参考。

一、说在前面的概念

(一)分词

分词是将文本转换成一系列单词的过程,也可以叫做文本分析,在ES中被称为Analysis。其实在日常生活中,分词这个概念我们应该并不陌生,比如我们使用百度/谷歌搜索引擎进行检索的时候,我们常常可以发现,我们输入的一段句子会被分割成不同的关键词关联查询。
以“windows打开控制面板命令”为例子,我们在百度中进行搜索,会发现它被分割为、、等关键字来查询。





(二)分词器

对语句进行分词的前提是定义了分词的规则。ES中为我们提供了许多功能强大、场景丰富的分词器组件,英文是Analyzer,它的组成如下:

  • Character Filter
    -针对原始的文本进行处理,比如去除html标记

  • Tokenizer
    -将原始的文本按照一定的规则切分为单词

  • Token Filter
    -针对tokenizer处理的单词进行再加工,比如转小写、删除或新增等处理

我们可以看到分词器可以由三种组件组成,原始的数据流从Character Filter -> Tokenizer -> Token Filter一路下来,可以一步步地去除多余的数据再进去分割存储(输出)。

二、分词器的API

(一)简单的使用分词器

ES给我们提供了一个测试分词的API接口,方便验证分词效果,在这个API中我们可以指定使用的分词器和索引来源,还可以使用自定义的分词器进行查看。

执行后结果如下:



上面的例子中,我们使用的是默认的分词器,我们也可以自定义分词器来进行使用

(二)ES中自带的分词器
1. Standard 标准分词器

Standard是ES的默认分词器,具备按词切分、支持多语言;小写处理等特点。其具体组成如下图:


2. Simple Analyzer 简单分词器

简单分词器有着按照非字母切分、小写处理的特点,其具体组成如下图:


3. Whitespace Analyzer 空格分词器

这个分词器很好理解,就是将文本根据空格进行分词。其组成如下图


4. Stop Analyzer 语气助词分词器

5. Keyword Analyzer 关键字分词器

Keyword分词器是一个比较特殊的存在,它不会对输入的句子进行分词,而是直接将输入作为一个单词输出,也就是说会将输入看成是一个整体。其组成如下:


6. Pattern Analyzer 正则分词器

7. Langueage Analyzer 多语言分词器
(三)中文分词器
  • IK分词器
    IK分词器可以实现中英文单词的切分,支持ik_smart、ik_maxword等模式,可以自定义词库和支持热更新分词词典。其插件下载地址为:
    https://github.com/medcl/elasticsearch-analysis-ik




  • jieba 分词器
    jieba分词器是Python中最流行的分词系统,支持分词和词性标注,支持繁体分词和自定义词典、并行分词等,下载地址为:
    https://github.com/sing1ee/elasticsearch-jieba-plugin




  • Hanlp 分词器
    由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用,其下载地址为:https://github.com/hankcs/HanLP

  • THULAC 分词器
    THU Lexical Analyzer for Chinese,由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能,下载地址为:
    https://github.com/microbun/elasticsearch-thulac-plugin




三、自定义分词器

当ES提供的分词器不能满足我们的分词需要的时候,我们可以通过自定义分词器来满足我们的工作需要,下面我们就从ES分词器的各个组件来进行自定义分词的测试吧。

(一)Character Filter 字符过滤器
(二)Tokenizer 字符切分者

Tokenizer会将原始文本(此处是指已经经过char_filter处理过的文本)按照一定的规则切分为单词,自带的Tokenizer如下:

Tokenizer 功能 standard 按照单词进行分割 letter 按照非字符类进行分割 whitespace 按照空格进行分割 UAX URL Email 按照standard分割,但不会分割邮箱和url NGram和Edge NGram 连词分割 Path Hierarchy 按照文件路径进行切割
(三)Token Filter
token filter 功能 lowercase 将所有的term转换为小写 stop 删除stop words NGram和Edge NGram 连词分割 Synonym 添加近义词的term
(四)自定义分词的API

比如我们要自定义这样结构的一个分词器:



具体的定义语句如下:

我们再来举一个例子:



想要定义这样一个分词器,我们的建分词器语句为:

四、分词的使用说明

对于ES分词的使用,一共有两个时机,一个是创建文档和更新文档(Index time)时,会对相应的文档进行分词处理;第二是查询时,会对查询语句进行分词。

  • 索引时分词
    索引时分词是通过配置Index Mapping 中每个字段的analyzer属性实现的

  • 查询时分词
    查询时分词可以有两种形式,分别是查询的时候通过analyzer指定分词器以及通过index mapping设置search_analyzer实现

    我们可以发现,在创建index的时候也可以定义查询时分词,一般来说,如果在创建索引的时候定义了查询时使用的分词器,那么我们在执行查询的过程中,也是要使用相同的分词器,否则会出现无法匹配的情况!!!







五、使用分词的建议




























版权声明


相关文章:

  • js 注释规范2025-09-02 18:29:59
  • cpp swap函数2025-09-02 18:29:59
  • memtest怎么检测8g2025-09-02 18:29:59
  • vue3管理系统简单模板2025-09-02 18:29:59
  • rman命令详解2025-09-02 18:29:59
  • 迈迪工具集下载安装教程2025-09-02 18:29:59
  • java swing 教程2025-09-02 18:29:59
  • python 打包pyc2025-09-02 18:29:59
  • es6新特性面试题2025-09-02 18:29:59
  • 面向对象设计的主要内容2025-09-02 18:29:59