分词机制详解
1.什么是分词 ?
分词(Tokenization
)是指将文本拆分成一个个独立的 词项(token
)的过程。在 Elasticsearch 中,分词是将原始文本分解为可被索引和搜索的基本单元的处理步骤。
例如:“Elasticsearch是一个强大的搜索引擎
” → [“elasticsearch
”, “是
”, “一个
”, “强大
”, “的
”, “搜索
”, “引擎
”]
2.为什么需要分词 ?
- 提高搜索效率:将文本分解为词项可以建立倒排索引,快速定位文档。
- 提升搜索准确性:通过分词可以匹配更精确的词项而非整个文本。
- 支持语言特性:不同语言有不同的分词需求(如中文需要分词,英文按空格分)。
- 实现高级搜索功能:如模糊搜索、同义词搜索等都依赖分词结果。
3.分词发生的阶段
分词主要发生在两个阶段:
- 索引阶段(
Indexing Time
):当文档被索引时,对文本字段内容进行分词处理。 - 搜索阶段(
Search Time
):对查询字符串进行分词处理(可使用与索引不同的分词器)。
4.分词器的组成
一个完整的分词器(Analyzer)由三部分组成:
- 字符过滤器(
Character Filters
):原始文本预处理- 如去除 HTML 标签、替换特殊字符等。
- 一个分词器可有 0 个或多个字符过滤器。
- 分词器(
Tokenizer
):将文本拆分为词项- 必须且只有一个分词器。
- 如标准分词器、中文分词器等。
- 词项过滤器(
Token Filters
):对词项进行进一步处理- 如小写转换、去除停用词、添加同义词等。
- 一个分词器可有 0 个或多个词项过滤器。
5.分词器的分类
5.1 内置分词器
分词器名称 |
|
---|---|
Standard Analyzer | 默认分词器,按词切分,小写处理 |
Simple Analyzer | 按非字母字符切分,小写处理 |
Whitespace Analyzer | 按空白字符切分,不转小写 |
Keyword Analyzer | 不分词,将整个输入作为一个词项 |
Pattern Analyzer | 使用正则表达式分词 |
Language Analyzers | 针对特定语言的分词器(如 english 、french 等) |
5.2 中文分词器(需要插件)
分词器名称 |
|
---|---|
IK Analyzer | 支持中文细粒度和智能分词两种模式 |
Jieba Analyzer | 结巴中文分词 |
HanLP Analyzer | 功能丰富的中文分词器 |
THULAC | 清华大学中文分词器 |
5.3 自定义分词器
可以通过组合不同的字符过滤器、分词器和词项过滤器来创建自定义分词器:
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"char_filter": ["html_strip"],
"tokenizer": "standard",
"filter": ["lowercase", "stop"]
}
}
}
}
}
选择合适的分词器对搜索质量至关重要,需要根据实际业务需求和数据特点来选择或定制分词方案。
6.电商平台商品搜索 - 自定义分词器案例
6.1 场景需求
假设我们正在为一个跨境电商平台构建商品搜索系统,该平台主要销售电子产品,有以下特点:
- 商品标题包含多种语言(英文、中文、品牌特有名词)
- 商品型号规格复杂(如 “
iPhone 15 Pro Max 256GB
”) - 需要支持同义词搜索(如 “
手机
” 和 “智能手机
” 应匹配相同结果) - 需要忽略特殊字符但保留重要符号(如 “
Wi-Fi
” 中的横线应保留)
6.2 自定义分词器设计
PUT /ecommerce_products
{
"settings": {
"analysis": {
"char_filter": {
"special_chars_filter": {
"type": "mapping",
"mappings": [
"& => and",
"® => ",
"™ => ",
"【 => [",
"】 => ]"
]
}
},
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
},
"tech_synonyms": {
"type": "synonym",
"synonyms": [
"手机, 智能手机, cellphone, mobile phone",
"笔记本, 笔记本电脑, notebook, laptop",
"平板, 平板电脑, tablet"
]
},
"product_type_filter": {
"type": "word_delimiter",
"preserve_original": true,
"split_on_numerics": false,
"split_on_case_change": false
}
},
"analyzer": {
"product_analyzer": {
"type": "custom",
"char_filter": [
"html_strip",
"special_chars_filter"
],
"tokenizer": "standard",
"filter": [
"lowercase",
"english_stop",
"tech_synonyms",
"product_type_filter",
"asciifolding"
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "product_analyzer",
"search_analyzer": "product_analyzer"
},
"model_number": {
"type": "keyword"
}
}
}
}
6.3 分词器组件解析
- 字符过滤器(Char Filters):
html_strip
:去除 HTML 标签。special_chars_filter
:处理特殊字符和商标符号。
- 分词器(Tokenizer):
- 使用
standard
分词器作为基础。
- 使用
- 词项过滤器(Token Filters):
lowercase
:转为小写。english_stop
:去除英文停用词。tech_synonyms
:添加电子产品同义词。product_type_filter
:特殊处理产品型号(保留原始形式)。asciifolding
:将非 ASCII 字符转换。
6.4 实际效果示例
- 输入文本:“
Apple iPhone® 15 Pro Max 256GB【旗舰手机】支持Wi-Fi 6E
” - 分词结果:[“
apple
”, “iphone
”, “15
”, “pro
”, “max
”, “256gb
”, “旗舰
”, “手机
”, “智能手机
”, “cellphone
”, “mobile phone
”, “wi-fi
”, “6e
”]
6.5 搜索场景优势
- 多语言支持
- 搜索 “
手机
” 也能找到标题含 “智能手机
” 或 “cellphone
” 的商品。
- 搜索 “
- 型号规格处理
- 搜索 “
iphone 15 pro
” 能匹配完整型号 “iPhone 15 Pro Max 256GB
”。 - 但不会错误拆分 “
256GB
” 为 “256
” 和 “gb
”。
- 搜索 “
- 特殊符号处理
- “
wi-fi
” 和 “wifi
” 会被视为等价搜索词。 - 但保留重要连接符确保技术术语准确性。
- “
- 品牌保护
- 商标符号
®
被去除,但品牌名称保留。
- 商标符号
6.6 实际应用
索引文档
POST /ecommerce_products/_doc/1
{
"title": "Apple iPhone® 15 Pro Max 256GB【旗舰手机】支持Wi-Fi 6E",
"model_number": "IPH15PM256"
}
搜索示例 1:同义词搜索
GET /ecommerce_products/_search
{
"query": {
"match": {
"title": "智能手机"
}
}
}
能匹配到包含 “手机
” 或 “cellphone
” 的文档。
搜索示例 2:型号搜索
GET /ecommerce_products/_search
{
"query": {
"match": {
"title": "iphone 15 pro"
}
}
}
能匹配完整型号 “iPhone 15 Pro Max 256GB
”。
这个自定义分词器设计有效解决了电商产品搜索中的多语言处理、同义词扩展、特殊符号处理等典型问题,显著提升了搜索准确性和用户体验。