词元过滤器(Token Filters)

词元过滤器(Token Filters) #

词元过滤器是分析链的最后阶段,对分词器产生的词元进行增强处理。一个分析器可以配置多个词元过滤器,按顺序执行。

概念指南 → 深入理解各类过滤器原理:


词元过滤器在分析链中的位置 #

原始文本 ──→ 字符过滤器 ──→ 分词器 ──→ [词元过滤器链] ──→ 索引
                                        ↑
                                    增强处理阶段
                              lowercase → stemmer → stop

按功能分类速查 #

大小写与归一化 #

过滤器说明典型用途
lowercase转小写最常用,大小写不敏感搜索
uppercase转大写特殊规范化需求
asciifolding音标→ASCIIcafécafe
cjk_widthCJK 全角/半角转换中日韩文本标准化

词干提取(Stemming) #

将单词还原为词根,提升召回率。

过滤器说明适用语言
stemmer通用词干提取多语言(见配置)
snowballSnowball 算法欧洲语言
porter_stemPorter 算法英语
kstemKStem 算法英语(较温和)
stemmer_override自定义词干规则覆盖默认行为
keyword_marker标记不做词干处理的词保护特定词汇

选型建议:英语用 stemmer + english,需要更精确控制用 kstem

停用词与过滤 #

过滤器说明典型用途
stop移除停用词过滤 the, a, is 等
keep_words仅保留指定词白名单过滤
keep_types按类型过滤保留/移除数字等
length按长度过滤移除过短/过长词元
limit限制词元数量防止超大文档

同义词扩展 #

过滤器说明典型用途
synonym同义词替换/扩展基础同义词
synonym_graph支持多词同义词推荐,更灵活

N-gram 与部分匹配 #

过滤器说明典型用途
ngram生成 n-gram模糊匹配
edge_ngram边缘 n-gram自动补全
shingle词组组合短语匹配优化

中日韩(CJK)专用 #

过滤器说明典型用途
cjk_bigramCJK 二元分词中日韩基础分词
cjk_width全角/半角转换字符标准化

语言特定归一化 #

过滤器说明
arabic_normalization阿拉伯语归一化
bengali_normalization孟加拉语归一化
german_normalization德语归一化
hindi_normalization印地语归一化
indic_normalization印度语系通用归一化
persian_normalization波斯语归一化
sorani_normalization索拉尼语归一化
scandinavian_normalization斯堪的纳维亚语归一化
scandinavian_folding斯堪的纳维亚字符折叠
serbian_normalization塞尔维亚语归一化

模式处理 #

过滤器说明典型用途
pattern_capture正则捕获提取模式
pattern_replace正则替换词元转换

复合词处理 #

过滤器说明典型用途
dictionary_decompounder词典拆分复合词德语等复合词语言
word_delimiter按分隔符拆分WiFiWi, Fi
word_delimiter_graph增强版分隔符拆分推荐,支持图结构

词元增强 #

过滤器说明典型用途
common_grams常用词二元组短语查询优化
fingerprint排序去重连接文档指纹
multiplexer多路复用同位置多词元

工具类过滤器 #

过滤器说明典型用途
trim去除首尾空白清理词元
truncate截断过长词元限制词元长度
unique去除重复词元去重
remove_duplicates移除同位置重复精确去重
reverse反转字符串后缀搜索
elision移除省略词法语 l'avionavion
apostrophe移除省略符号后内容土耳其语等
classic经典过滤器配合 classic 分词器
decimal_digitUnicode 数字→ASCII数字标准化

高级/图处理 #

过滤器说明典型用途
flatten_graph扁平化词元图索引图结构输出
conditional条件过滤脚本控制处理
predicate_token_filter谓词过滤自定义过滤逻辑

负载与特殊用途 #

过滤器说明典型用途
delimited_payload分隔符负载词元附加权重
keyword_repeat关键字重复保留原词+词干
min_hash最小哈希文档相似度

常用组合示例 #

英文全文搜索标准配置 #

PUT /my-index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "english_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "english_stop",
            "english_stemmer"
          ]
        }
      },
      "filter": {
        "english_stop": {
          "type": "stop",
          "stopwords": "_english_"
        },
        "english_stemmer": {
          "type": "stemmer",
          "language": "english"
        }
      }
    }
  }
}

同义词 + 词干提取 #

{
  "analyzer": {
    "synonym_analyzer": {
      "type": "custom",
      "tokenizer": "standard",
      "filter": [
        "lowercase",
        "my_synonyms",
        "english_stemmer"
      ]
    }
  },
  "filter": {
    "my_synonyms": {
      "type": "synonym_graph",
      "synonyms": [
        "quick, fast, speedy",
        "big, large, huge"
      ]
    }
  }
}

自动补全(edge_ngram) #

{
  "analyzer": {
    "autocomplete": {
      "type": "custom",
      "tokenizer": "standard",
      "filter": [
        "lowercase",
        "autocomplete_filter"
      ]
    }
  },
  "filter": {
    "autocomplete_filter": {
      "type": "edge_ngram",
      "min_gram": 1,
      "max_gram": 20
    }
  }
}

过滤器顺序最佳实践 #

过滤器顺序影响分析结果,推荐顺序:

1. lowercase         ← 先转小写
2. asciifolding      ← 音标折叠
3. synonym_graph     ← 同义词扩展
4. stop              ← 移除停用词
5. stemmer           ← 词干提取

原因

  • 同义词词典通常用小写,所以 lowercase 在前
  • 停用词移除在词干提取前,避免词干后的词被误匹配
  • synonym_graph 需要在词干提取前,否则词干无法匹配同义词

测试词元过滤器 #

POST /_analyze
{
  "tokenizer": "standard",
  "filter": ["lowercase", "porter_stem"],
  "text": "The QUICK brown Foxes jumped"
}

测试自定义过滤器链:

POST /my-index/_analyze
{
  "analyzer": "english_analyzer",
  "text": "The quick brown foxes are jumping"
}