当前位置: 首页 > news >正文

ES常识5:主分词器、子字段分词器

文章目录

      • 一、主分词器:最基础的文本处理单元
        • 主分词器的作用
        • 典型主分词器示例
      • 二、其他类型的分词器:解决主分词器的局限性
        • 1. 子字段分词器(Multi-fields)
        • 2. 搜索分词器(Search Analyzer)
        • 3. 自定义分词器(Custom Analyzer)
        • 4. 专能分词器(Specialized Tokenizers)
      • 三、为什么需要多种分词器?
      • 总结

在 Elasticsearch(ES)中, 分词器(Analyzer) 是将文本拆分为可检索词元(Token)的核心组件。其中“主分词器”是最基础的类型,但为了满足多样化的文本处理需求,ES 还支持多种其他类型的分词器。以下从定义、分类、典型场景三个维度详细说明:

一、主分词器:最基础的文本处理单元

主分词器是 ES 中默认用于索引和搜索阶段的分词器,负责将原始文本(如中文句子、英文段落)拆分为最小可检索的词元(Token)。它是每个 text 类型字段的“核心处理器”,决定了文本的基础拆分逻辑。

主分词器的作用
  • 索引阶段:将文档内容(如“北京天安门”)拆分为词元(如北京天安门),写入倒排索引。
  • 搜索阶段:将用户输入的查询词(如“天安门”)拆分为词元(如天安门),与索引中的词元匹配。
典型主分词器示例
  • 中文场景ik_max_word(细粒度拆分,如“人工智能”→人工智能人工智能)。
  • 英文场景standard(标准分词器,按空格和标点拆分,转小写)。
  • 日文场景kuromoji(基于日语词法分析的分词器)。

二、其他类型的分词器:解决主分词器的局限性

主分词器虽能处理基础需求,但面对复杂场景(如多语言混合、拼音检索、模糊匹配)时,需要其他类型的分词器补充。ES 支持以下几类“非主分词器”:

1. 子字段分词器(Multi-fields)

通过 fields 属性为同一个字段创建多个子字段,每个子字段使用不同的分词器,满足不同查询需求。
核心价值:一个字段支持多种拆分方式(如汉字、拼音、全拼)。

示例(中文+拼音混合索引):

{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word",  // 主分词器(处理汉字)"fields": {"pinyin": {                // 子字段(处理拼音)"type": "text","analyzer": "pinyin_analyzer"},"keyword": {               // 子字段(保留原文,用于精确匹配)"type": "keyword"}}}}}
}
  • 主字段 title:用 ik_max_word 拆分汉字(如“中国”→中国)。
  • 子字段 title.pinyin:用拼音分词器拆分(如“中国”→zhongguozg)。
  • 子字段 title.keyword:用 keyword 分词器(不拆分,保留原文“中国”)。
2. 搜索分词器(Search Analyzer)

通过 search_analyzer 显式指定搜索阶段使用的分词器(与索引阶段的主分词器不同)。
核心价值:解决“索引时细粒度拆分,搜索时粗粒度匹配”的矛盾。

典型场景
索引时用 ik_max_word(细粒度,如“北京大学”→北京大学北京大学),搜索时用 ik_smart(粗粒度,如用户输入“北大”→北大)。此时需用 search_analyzer 确保搜索词拆分与索引词元匹配。

配置示例

{"mappings": {"properties": {"content": {"type": "text","analyzer": "ik_max_word",       // 索引分词器(细粒度)"search_analyzer": "ik_smart"    // 搜索分词器(粗粒度)}}}
}
3. 自定义分词器(Custom Analyzer)

通过组合 字符过滤器(Char Filter)分词器(Tokenizer)词元过滤器(Token Filter) 自定义分词逻辑,满足特定业务需求。
核心价值:灵活处理特殊文本(如去除HTML标签、保留数字范围)。

组成结构

analyzer: {char_filter: [ ... ],  # 预处理文本(如替换特殊符号)tokenizer: ...,         # 拆分文本为词元(核心)filter: [ ... ]         # 过滤/修改词元(如转小写、去停用词)
}

示例(处理英文+数字混合文本):

{"settings": {"analysis": {"analyzer": {"custom_analyzer": {"char_filter": ["html_strip"],  # 去除HTML标签"tokenizer": "standard",        # 按空格/标点拆分"filter": ["lowercase",                  # 转小写"asciifolding",               # 转换特殊字符(如é→e)"stop"                        # 去除停用词(如the、and)]}}}}
}
4. 专能分词器(Specialized Tokenizers)

ES 内置了多种针对特定场景的分词器,无需自定义即可直接使用:

  • keyword 分词器:不拆分文本,将整个字符串作为一个词元(用于精确匹配,如品牌名、ID)。
  • pattern 分词器:按正则表达式拆分(如按-拆分“2023-05-11”→20230511)。
  • ngram 分词器:生成连续字符组合(如“苹果”→苹果),用于模糊搜索(如输入“苹”召回“苹果”)。
  • path_hierarchy 分词器:按层级拆分路径(如“/a/b/c”→/a/a/b/a/b/c),用于目录结构检索。

三、为什么需要多种分词器?

主分词器是基础,但单一分词器无法满足所有需求:

  • 多维度检索:用户可能用汉字、拼音、首字母搜索同一内容(需子字段分词器)。
  • 精度与性能平衡:索引时细粒度拆分(提升召回),搜索时粗粒度拆分(提升性能,需搜索分词器)。
  • 特殊文本处理:如去除HTML标签、保留数字范围(需自定义分词器)。
  • 跨语言支持:中文用 ik,英文用 standard,日文用 kuromoji(需不同主分词器)。

总结

主分词器是 ES 中最基础的分词器,负责索引和搜索的默认文本处理。但为了应对复杂场景,ES 还支持子字段分词器(多维度检索)、搜索分词器(精度与性能平衡)、自定义分词器(特殊文本处理)和专能分词器(特定场景)。理解这些类型的核心差异,能帮助你根据业务需求(如召回率、准确性、性能)选择合适的分词方案。

相关文章:

  • Nodejs核心机制
  • 支持selenium的chrome driver更新到136.0.7103.92
  • 【Java EE初阶 --- 多线程(初阶)】线程安全问题
  • 百度AI战略解析:文心一言与自动驾驶的双轮驱动
  • Hibernate 性能优化:告别慢查询,提升数据库访问性能
  • 基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战
  • 使用FastAPI和React以及MongoDB构建全栈Web应用05 FastAPI快速入门
  • 红黑树(C++)
  • A1062 PAT甲级JAVA题解 Talent and Virtue
  • 大语言模型通过MCP控制STM32-支持Ollama、DeepSeek、openai等
  • 【C++】内存管理 —— new 和 delete
  • D. Explorer Space(dfs+剪枝)
  • 深入理解深度Q网络DQN:基于python从零实现
  • 三、c语言练习四题
  • 前端项目打包部署流程j
  • 无人机空中物流优化:用 Python 打造高效配送模型
  • 华为IP(6)
  • 中空电机在安装垂直轴高速电机后无法动平衡的原因及解决方案
  • 【网络】:传输层协议 —— UDP、TCP协议
  • Compose笔记(二十二)--NavController
  • 专访|导演刘江:给谍战题材注入现实主义的魂
  • 城市轨道交通安全、内河港区布局规划、扎实做好防汛工作……今天的上海市政府常务会议研究了这些重要事项
  • 国羽用冠军开启奥运周期,林丹:希望洛杉矶奥运取得更好成绩
  • 加强战略矿产出口全链条管控工作部署会召开
  • 18世纪“精于剪切、复制、粘贴”的美国新闻界
  • 乘联分会:上半年车市价格竞争温和,下半年价格战或再开启