分词器(Tokenizers)

分词器(Tokenizers) #

分词器是分析链的核心组件,负责将字符流拆分为词元(tokens)。每个分析器有且只有一个分词器。

概念指南 → 深入理解分词原理,请阅读 词汇识别


分词器工作原理 #

输入文本: "Actions speak louder than words."
            ↓
       [分词器处理]
            ↓
词元流: [Actions, speak, louder, than, words]
        + 位置信息 + 偏移量 + 类型标签

分词器不仅拆分文本,还会维护词元的元数据:

元数据用途示例
位置(position)短语查询、邻近查询speak 位于位置 2
偏移量(offset)搜索结果高亮speak 起始于字符 8
类型(type)分类过滤<ALPHANUM>, <NUM>

分词器速查表 #

单词分词器(Word-Oriented) #

适用于全文搜索场景,将文本拆分为独立单词。

分词器说明推荐场景
standardUnicode 标准分词,移除标点通用首选,支持大多数语言
letter非字母处拆分纯字母文本
lowercaseletter + 小写转换大小写不敏感搜索
whitespace仅按空白拆分保留标点符号
uax_url_email保留 URL 和邮箱完整性含链接或邮箱的文本
classic英文语法规则,保留缩写英文文档、邮件

部分匹配分词器(Partial Word) #

生成词元片段,支持前缀匹配、模糊搜索等场景。

分词器说明典型输出
ngram生成 n-gram 序列quick[q, qu, ui, ic, ck, ...]
edge_ngram从开头生成 n-gramquick[q, qu, qui, quic, quick]

选型建议

  • 即时搜索(search-as-you-type)edge_ngram
  • 模糊匹配、拼写纠错ngram

结构化文本分词器(Structured Text) #

处理标识符、路径、模式等结构化内容。

分词器说明推荐场景
keyword不分词,整体作为单个词元精确匹配(ID、SKU)
pattern正则表达式拆分自定义分隔规则
simple_pattern_splitLucene 正则,性能更优高性能正则分词
char_group按字符集拆分简单字符分隔
path_hierarchy路径层级拆分文件路径、分类树

分词器选型指南 #

应用场景推荐分词器说明
通用全文搜索standard默认选择,开箱即用
中文搜索配合中文分析器中文分析器
即时搜索提示edge_ngram支持前缀匹配
精确 ID 匹配keyword不分词
文件路径搜索path_hierarchy层级展开
保留 URL 完整uax_url_email不拆分链接
日志分析pattern / char_group按自定义分隔符

自定义分词器示例 #

edge_ngram 实现即时搜索 #

PUT /my-index
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "autocomplete_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 10,
          "token_chars": ["letter", "digit"]
        }
      },
      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "autocomplete_tokenizer",
          "filter": ["lowercase"]
        }
      }
    }
  }
}

path_hierarchy 处理文件路径 #

PUT /my-index
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "path_tokenizer": {
          "type": "path_hierarchy",
          "delimiter": "/",
          "reverse": false
        }
      }
    }
  }
}

输入 /usr/local/bin → 输出 [/usr, /usr/local, /usr/local/bin]


测试分词器 #

使用 _analyze API 测试分词效果:

POST /_analyze
{
  "tokenizer": "standard",
  "text": "Hello, World! This is Easysearch."
}

测试自定义分词器:

POST /my-index/_analyze
{
  "tokenizer": "autocomplete_tokenizer",
  "text": "easysearch"
}

分词器完整列表 #

单词分词器 #

分词器描述
standard在单词边界处拆分,移除大部分标点符号
letter在非字母字符处拆分
lowercaseletter + 小写转换
whitespace仅在空白字符处拆分
uax_url_emailstandard 变体,保留 URL 和邮箱完整
classic基于语法的英文分词器

部分匹配分词器 #

分词器描述
ngram生成指定长度范围的 n-gram
edge_ngram从词元开头生成 n-gram
simple_patternLucene 正则匹配(不拆分)

结构化文本分词器 #

分词器描述
keyword不分词,整体输出
patternJava 正则表达式分词
simple_pattern_splitLucene 正则拆分,性能更优
char_group按指定字符集拆分
path_hierarchy按路径分隔符层级拆分

国际化分词器 #

分词器描述插件
thai泰语分词(Java BreakIterator)内置
icu_tokenizerICU 多语言分词analysis-icu

中文分词器 #

分词器描述插件
ik_smartIK 智能分词(粗粒度)analysis-ik
ik_max_wordIK 最大化分词(细粒度)analysis-ik
jieba_searchJieba 搜索模式analysis-jieba
jieba_indexJieba 索引模式analysis-jieba
pinyin拼音分词analysis-pinyin
pinyin_first_letter拼音首字母分词analysis-pinyin
hanlpHanLP 通用分词analysis-hanlp
hanlp_standardHanLP 标准分词analysis-hanlp
hanlp_indexHanLP 索引分词analysis-hanlp
hanlp_nlpHanLP NLP 分词analysis-hanlp
hanlp_crfHanLP CRF 分词analysis-hanlp
hanlp_n_shortHanLP N-最短路径analysis-hanlp
hanlp_dijkstraHanLP 最短路径analysis-hanlp
hanlp_speedHanLP 极速分词analysis-hanlp
stconvert简繁转换分词analysis-stconvert