当前位置: 代码网 > it编程>编程语言>Java > ElasticSearch中常见的分词器介绍

ElasticSearch中常见的分词器介绍

2024年08月01日 Java 我要评论
ElasticSearch是一个高效的分布式搜索引擎,其中分词器是它的核心组件之一,平常开发中选择一个合适的分词器可以很大程度上提高检索效率,所以特意花点时间快速了解ElasticSearch中各大常见的分词器,本文也将分别介绍ElasticSearch中常见的几大分词器的特点、适用场景,以及如何适用推荐阅读ElasticSearch快速入门_知识汲取者的博客-CSDN博客custom可以根据具体需求自定义分词器,包括指定分词器、字符过滤器、标记过滤器等。适用场景。

elasticsearch中常见的分词器介绍

前言

分词器的作用

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

如何指定分词器

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

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

    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:

    • 类型:
      • 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:

    • 类型:

      • 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" // 使用我们配置的分词器
          }
        }
      }
    }
    

正则匹配分词器

  • 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 分配给相应的字段。

示例

{
  "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"]
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com