ElasticSearch中常见的分词器介绍

文章目录

  • ElasticSearch中常见的分词器介绍
    • 前言
    • 分词器的作用
    • 如何指定分词器
    • 分词器的组成
    • 分词器的类型
      • 标准分词器
      • 空格分词器
      • 简单分词器
      • 关键词分词器
      • 停用词分词器
      • IK分词器
      • NGram分词器
      • 正则匹配分词器
      • 语言分词器
      • 自定义分词器

ElasticSearch中常见的分词器介绍

前言

ElasticSearch是一个高效的分布式搜索引擎,其中分词器是它的核心组件之一,平常开发中选择一个合适的分词器可以很大程度上提高检索效率,所以特意花点时间快速了解ElasticSearch中各大常见的分词器,本文也将分别介绍ElasticSearch中常见的几大分词器的特点、适用场景,以及如何使用

推荐阅读

  • ElasticSearch快速入门_知识汲取者的博客-CSDN博客

分词器的作用

分词器是在搜索引擎和文本处理中起关键作用的组件,它负责将文本切分成一个个有意义的词语,以建立索引或进行搜索和分析。

上面可能说的有一些太官方了,详细点说就是,ES搜索引擎是根据词条进行检索的,这里的词条相当于MySQL中的索引,是ElasticSearch能实现海量数据高效检索的核心,在MySQL中,如果我们不恰当的建立索引,就会影响数据库的查询性能,比如我们为区分度不大的字段建立索引,SQL优化器评测发现走索引性能和全表扫描的性能差不多,这时候就直接进行全表扫描了,此时索引就一点作用都没有了,同理这个分词也是一样的道理,他都目的也是将一个一句话分成若干个词条,以词条为索引,以此来提高检索的效率和检索的正确性

再举一个实际的例子,比如这里有一句话“他们在商店买了一些苹果手机和一些苹果”,如果我们分词时将苹果手机进行拆分,我们搜索苹果手机,可能无法搜索出带有苹果手机的文档

他们 在 商店 买 一些 苹果 手机 和 一些 苹果

而一下的分词,则可以正确搜索出带有苹果手机的词条

他们 在 商店 买 了 一些 苹果手机 和 一些 苹果
  • 文本切分: 分词器根据一定的规则将文本切分为单个的词语或词汇单元。这个过程通常涉及到处理空格、标点符号、停用词等。
  • 标准化: 分词器可以对词语进行标准化,例如将所有字符转为小写,以实现大小写不敏感的搜索。这有助于提高搜索的准确性。
  • 去除停用词: 分词器通常会去除一些常见的停用词,这些词语在搜索中往往没有实际的意义,例如 “and”, “the”, “is” 等。
  • 词干化: 对于词语的各种形式(如单数和复数、动词的不同时态等),分词器可以将它们转化为同一个基本形式,以提高搜索的准确性。
  • 自定义规则: 分词器允许用户根据具体需求定义自己的切分规则、标准化规则等,以适应特定的搜索场景。
  • 支持多语言: 对于全球化的应用,分词器能够支持多种语言,包括中文、英文、法文等,以确保对不同语言的文本都能有效地进行处理。
  • 支持搜索建议: 通过使用边缘 n-gram 等技术,分词器可以支持搜索建议功能,提供更智能的搜索提示。

如何指定分词器

  • 方式一:创建索引时,通过映射直接指定分词器

    PUT /your_index_name
    {
      "mappings": {
        "properties": {
          "your_field_name": {
            "type": "text",
            "analyzer": "your_analyzer_name"
          },
          // other fields...
        }
      }
    }
    
  • Step2:修改索引时,通过修改映射修改分词器

    PUT /your_index_name/_mapping
    {
      "properties": {
        "your_field_name": {
          "type": "text",
          "analyzer": "your_analyzer_name"
        },
        // other fields...
      }
    }
    

注意

  1. 如果不指定分词器,则默认使用标准分词器 standard
  2. 不同的字段可以使用不同的分词器,根据实际需求选择适当的分词策略
  3. ElasticSearch默认自带Standard AnalyzerWhitespace AnalyzerSimple AnalyzerKeyword AnalyzerStop Analyzer等分词器,其它分词器,比如:IK Analyzer需要手动下载

分词器的组成

分词器主要由以下三部分组成

  • Character Filters(字符过滤器):这一步针对原始文本进行预处理,对文本中的字符进行修改或删除。例如,去除 HTML 标签、替换特定字符等。
  • Tokenizer(分词器):分词器将经过字符过滤器处理后的文本切分成一个个的词条,形成一个词条流。切分的规则可以是按空格、标点符号等,或者根据某种特定的算法,比如边缘 n-gram。
  • Token Filters(词汇过滤器):这一步对切分后的词条流进行进一步的处理。可以进行词条的大小写转换、删除停用词(常用但无实际意义的词语)、词干化等操作。词汇过滤器对于调整文本以适应索引和搜索的需求非常重要。

image-20231111161801193

分词器的类型

分词器分词依据特点
Standard Analyzer空格、标点符号小写化处理、过滤符号
Whitespace Analyzer空格不进行小写化处理、保留所有字符
Simple Analyzer非字母(符号、数字)小写化处理、过滤符号、支持中文拼音分词
Keyword Analyzer将整个输入作为一个词条
Stop Analyzer空格小写化处理、过滤停用词
IK Analyzer词典中文分词
Edge NGram Analyzern-gram按指定步长进行分词
Pattern Analyzer正则匹配字符较为灵活
Language Analyzer空格支持多国语言
Custom Analyzer自定义灵活

标准分词器

  • Standard Analyzer(默认):

    • 类型: standard
    • 特点:
      1. 根据空格和标点符号分割文本
      2. 进行小写化处理
      3. 过滤符号
    • 适用场景:适用于通用的全文搜索

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
    

空格分词器

  • Whitespace Analyzer:

    • 类型: whitespace
    • 特点:
      1. 根据空格分割文本
      2. 不进行小写化
      3. 保留所有字符
    • 适用场景:适用于不需要额外处理的精确匹配场景。

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]
    

简单分词器

  • Simple Analyzer:

    • 类型: simple

    • 特点:

      1. 按非字母切分
      2. 连续的数字为一个词条
      3. 进行小写处理
      4. 过滤符号
      5. 中文字单独建索引,并且把中文字转成拼音后也建搜索,这样就能同时支持中文和拼音检索。另外把拼音首字母也建索引,这样搜索 zjl 就能命中 “周杰伦”。
    • 适用场景:适用一些简单的中文分词

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
    

关键词分词器

  • Keyword Analyzer:

    • 类型: keyword
    • 特点: 将整个输入视为单个关键字,不进行分词。
    • 适用场景:适用于不需要分词的场景,比如精确匹配。

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["The quick brown fox jumps over the lazy dog."]
    

停用词分词器

  • Stop Analyzer:

    • 类型: stop
    • 特点:
      1. 去除停用词(is、a、the……)
      2. 根据空格分割文本
      3. 进行小写化处理。
    • 适用场景:适用于需要去除常见停用词的场景。

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["quick", "brown", "fox", "jumps", "over", "lazy", "dog"]
    

IK分词器

  • IK Analyzer:

    详情请参考:https://github.com/medcl/elasticsearch-analysis-ik

    • 类型:
      • ik_max_word :会将文本做最细粒度的拆分,会穷尽各种可能的组合,适合 Term Query
      • ik_smart:会做最粗粒度的拆分,不会对同一个词进行重复分词,适合 Phrase 查询
    • 适用场景:适用于中文文本分析。

    示例

    原始文本:"中华人民共和国国歌"
    ik_max_word分词结果:["中华人民共和国", "中华人民", "中华", "华人", "人民共和国", "人民", "人", "民", "共和国", "共和", "和", "国国", "国歌"]
    ik_smart分词结果:["中华人民共和国", "国歌"]
    
  • ik分词器的使用步骤

    • Step1:下载ik分词器
    • Step2:将下载的压缩包解压到 Elasticsearch 插件目录(plugins 文件夹)中
    • Step3:重启ElasticSearch
    • Step4:直接指定即可

NGram分词器

  • NGram Analyzer:

    详情参考:ElasticSearch之ngram分词器-CSDN博客

    • 类型:

      • edge_ngram:从单词的开头提取 n-gram
      • ngram:在整个单词中提取 n-gram
    • 适用场景:适用于前缀搜索和搜索建议

    示例

    原始文本:"I am Chinese."
    
    edge_ngram分词结果:
    n=2(bigram): ["I am", "am Chinese."]
    n=3(trigram): ["I am Chinese."]
    n=4(four-gram): ["I am Chinese."]
    
    ngram分词结果:
    n=2(bigram): ["I am", "am Chinese."]
    n=3(trigram): ["I am Chinese."]
    n=4(four-gram): ["I am Chinese."]
    

    备注:

    1. NGram Analyzer 不会过滤符号
    2. NGram Analyzer默认的步长是1
    {
      "settings": {
        // 创建分词器
        "analysis": {
          "analyzer": {
            "my_edge_ngram_analyzer": {
              "tokenizer": "standard", // 指定分词器
              "filter": ["my_edge_ngram_filter"] // 指定词汇过滤器
            }
          },
          "filter": {
            "my_edge_ngram_filter": {
              "type": "edge_ngram",
              "min_gram": 1, // 词汇最小长度为一个字符,注意:一个单词、数字、中文都是一个字符
              "max_gram": 10 // 词汇最大长度为10个字符
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "content": {
            "type": "text",
            "analyzer": "my_edge_ngram_analyzer" // 使用我们配置的分词器
          }
        }
      }
    }
    

    知识拓展:n-gram 概念

    n-gram 是一种文本处理的方法,其中 “n” 表示包含的元素的数量。在自然语言处理和信息检索中,n-gram 通常指的是连续的 n 个单词(或字符)序列。

    • Unigram(1-gram): 包含一个单词的序列。例如,对于句子 “The quick brown fox”,每个单词都是一个 unigram。
    • Bigram(2-gram): 包含两个相邻单词的序列。例如,对于句子 “The quick brown fox”,bigrams 包括 “The quick”、“quick brown”、“brown fox”。
    • Trigram(3-gram): 包含三个相邻单词的序列。例如,对于句子 “The quick brown fox”,trigrams 包括 “The quick brown”、“quick brown fox”。

    这个 n 表示按照几个单词来进行划分

正则匹配分词器

  • Pattern Analyzer
    • 类型pattern
    • 特点:根据正则匹配进行分词
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_pattern_analyzer": {
          "type": "pattern",
          "pattern": "\\W+"  // 正则表达式模式,表示使用非单词字符作为分隔符
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "my_pattern_analyzer"
      }
    }
  }
}

上诉配置的 Pattern Analyzer 与 Standard Analyzer的效果是一模一样的

语言分词器

  • Language Analyzer
    • 类型
      • english:英语分词器
      • french:法语分词器
    • 特点
      1. 支持多个不同国家语言的分词,但就是没有支持中文的(中文分词器还得靠国内大佬或机构开发)
      2. 应用英文的 Stop Analyzer(停用词过滤器)
      3. 单词小写化
      4. 不会过滤符号
    • 适用场景:一些国际化的软件可能会用,但是面向国内用户基本上用不上
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "english"
      }
    }
  }
}

原始文本:"The quick brown fox jumps over the lazy dog."
分词结果:["quick", "brown", "fox", "jumps", "over", "lazy", "dog"]

自定义分词器

  • Custom Analyzer:

    • 类型: custom

    • 特点: 可以根据具体需求自定义分词器,包括指定分词器、字符过滤器、标记过滤器等。

    • 适用场景:现有分词器不满足当前功能,或者想要实现更加高效且灵活的分词

  • 实现自定义分词器的步骤

    • Step1定义字符过滤器(Char Filter),可以通过字符过滤器执行预处理,例如删除 HTML 标签或进行字符替换。
    • Step2定义分词器(Tokenizer), 分词器负责将文本切分为单词或词条。可以选择现有的分词器,也可以创建自定义的分词逻辑。
    • Step3定义词汇过滤器(Token Filter) ,可以通过词汇过滤器对切分后的单词进行进一步处理,例如小写处理、停用词过滤、同义词处理等。
    • Step4创建 Custom Analyzer ,将定义的字符过滤器、分词器和词汇过滤器组合成一个自定义的 Custom Analyzer
    • Step5将 Custom Analyzer 应用到字段 ,在创建索引时,将自定义的 Custom Analyzer 分配给相应的字段。

示例

在下面的示例中,my_analyzer 是一个自定义的 Custom Analyzer,包含了一个 HTML 标签过滤器、标准分词器和小写过滤器。该分析器被应用于名为 “content” 的字段。实际上,你可以根据需求自定义各个组件,以满足你的分词需求。

{
  "settings": {
    "analysis": {
      // 指定字符过滤器
      "char_filter": {
        "my_char_filter": {
          "type": "html_strip" // 去除文本中的 HTML 标签的字符过滤器
        }
      },
      // 指定分词器
      "tokenizer": {
        "my_tokenizer": {
          "type": "standard" // 指定标准分词器,按照标准分词器进行分词
        }
      },
      // 指定词汇过滤器
      "filter": {
        "my_filter": {
          "type": "lowercase" // 小写化处理
        }
      },
      // 创建自定义分词器
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "char_filter": ["my_char_filter"],
          "tokenizer": "my_tokenizer",
          "filter": ["my_filter"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": { // 给 content 字段应用 自定义分词器
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}
原始文本:<p>This is <strong>bold</strong> text.</p>
分词结果:["this", "is", "bold", "text"]

参考资料

  • Anatomy of an analyzer | Elasticsearch Guide 8.11| Elastic
  • ElasticSearch 分词器,了解一下 - 知乎 (zhihu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/132667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音小程序开发:探索技术创新的代码之旅

随着抖音小程序的兴起&#xff0c;企业纷纷将目光投向这个充满活力的平台。抖音小程序开发不仅为品牌提供了更广泛的曝光机会&#xff0c;更是技术创新的舞台。本文将带领读者深入探索抖音小程序开发的技术要点&#xff0c;探讨如何通过代码实现个性化、高效的小程序。 1. 小…

【2】Gradle-快速入门使用【Gradle项目结构概念】

目录 【2】Gradle-快速入门使用【Gradle项目结构概念】安装本地安装先决条件 官网安装教程 Gradle 快速指南初始化项目查看Gradle的项目结构了解Gradle Wrapper调用Gradle包装器了解Gradle的项目结构了解settings文件了解构建脚本 IDEA中使用Gradle创建一个新项目创建一个Sprin…

【STM32】

STM32 1 CMSIS1.1 概述1.2 CMSIS 应用程序文件描述 2 库2.1 简介2.2 标准外设库&#xff08;standrd Peripheral Libraries&#xff09;2.3 HAL 库2.3.1 目录结构2.3.2 HAL库API函数和变量的命名规则2.3.3 HAL库对寄存器位操作的相关宏定义2.3.4 HAL库回调函数2.3.5 HAL使用注意…

6.存储器概述,主存储器

目录 一. 存储系统基本概念 &#xff08;1&#xff09;存储系统的层次结构 &#xff08;2&#xff09;分类 &#xff08;3&#xff09;存储器的性能指标 二. 主存储器的基本组成 三. SRAM和DRAM 四. 只读存储器ROM 五. 提升主存速度的方法 &#xff08;1&#xff09;双…

【tg】 5 :线程切换

manager 可以切到 其他类的其他线程去执行。线程切换 先通过 networkmgr 线程 执行 ,但是传递了Manager 自己的线程 进去。在networkmgr 的network线程中,获取到stats数据,然后扔给 manager的线程thread ,去posttask 还行这个task里调用了mediamanager 的perform ,在media…

U盘不可以访问的维护

u盘打不开&#xff0c;可按下图&#xff0c;设置&#xff1a;winR→gpedit.msc&#xff1b;配置“管理模板”→“系统”→“可移动存储访问”→“所有可移动存储类”。 然后&#xff0c;选择“未配置”&#xff0c;如下图

环形处理习题,举例:约瑟夫环,魔方阵

目录 约瑟夫环 魔方阵 约瑟夫环 题目描述&#xff1a;有n 个人围成一圈,顺序排号。从第1个人开始报数从1到3报数凡是报到3 的人退出圈子,问最后留下的是原来的第几号? 环形处理:依次遍历数据集的每个元素&#xff08;每个人依次报号&#xff09;&#xff0c;直到遍历到最后…

xlua游戏热更新(lua访问C#)

CS.UnityEngine静态方法访问unity虚拟机 创建游戏物体 CS.UnityEngine.GameObject(new by lua);静态属性 CS.UnityEngine.GameObject(new by lua); -- 创建 local camera CS.UnityEngine.GameObject.Find(Main Camera); --查找 camera.name Renamed by Lua;访问组件 loca…

思维模型 斯金纳箱原理

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。通过合理奖惩&#xff0c;塑造行为&#xff0c;此名为“学习”。 1 斯金纳箱原理的应用 1.1 斯金纳箱在游戏设计中的应用-《糖果传奇》 《糖果传奇》是一款由 King 开发的三消游戏&#x…

C语言--定义一个包含年月日的结构体Day,实现一个函数,根据传入的结构体指针计算,该日期是当年的第几天?

一.题目要求 输入2000年6月5日&#xff0c;输出&#xff1a;这是2000年的第157天。 二.思路分析 首先定义一个包含年月日的结构体 年份&#xff1a;要判断是否是闰年&#xff0c;闰年的二月有29天&#xff0c;平年的二月有28天。 月份&#xff1a;一个月份分大月和小月&#…

leetCode 493 翻转对

给定一个数组 nums &#xff0c;如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。 未完待续~

IDEA的优化配置教程

前言 IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以…

Win11专业版安装Docker Desktop,并支持映射主机的gpu

一、Windows环境下安装 Docker 必须满足: 1. 64位Windows 11 Pro(专业版和企业版都可以) 2. Microsoft Hyper-V,Hyper-V是微软的虚拟机,在win11上是自带的,我们只需要启动就可以了 二、下载Docker Desktop安装包 方式一:进入官网下载 https://docs.docker.com/desktop…

基于VSCode + PlatformIO创建运行第一个esp32程序

文章目录 使用VSCode创建项目安装驱动下载驱动安装驱动连接开发板电脑识别开发板 编写程序烧录程序第一步、编译程序第二步、烧录程序第三步、开发板观察效果 原理讲解项目源码 在之前的课程&#xff0c;我们已经介绍了ESP32单片机&#xff0c;并且也已经安装好了开发环境&…

matplotlib 创建图和子图

Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。这里将会探索 matplotlib 的常见用法。 plt方式是先生成了一个画布&#xff0c;然后在这个画布上隐式的生成一个画图区域来进行画图&#xff1…

yum工具的使用

yum工具的使用 rpm的弊端 前面我们讲了下rpm&#xff0c;那么rpm有什么弊端呢&#xff1f;其弊端是显而易见的&#xff0c;当用rpm安装软件时&#xff0c;若遇到有依赖关系的软件&#xff0c;必须先安装依赖的软件才能继续安装我们要安装的软件&#xff0c;当依赖关系很复杂的…

drawio连接线的样式设置

drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存储&#xff0c;以及在线共…

ModStartBlog v8.5.0 评论开关布局调整,系统后台全面优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …

C语言每日一题(26)移除链表元素

力扣网 203. 移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 思路分析 针对如图的普通情况&#xff0c;不能简单的遍历到对应位置然后进行释放&#xff0c;一方…

Linux编写一个极简版本的Shell

Linux编写一个极简版本的Shell &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容在Linux环境下&#xff…