中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:
Web服务器
代理服务器
ZooKeeper
Kafka
RabbitMQ
Hadoop HDFS
Elasticsearch ES (本章节)
我们上个小节介绍倒排索引,里面有一个比较核心的概念就是系统能正常识别里面的单词,比如上个小节里面涉及到的几个单词:apple banana cherry date ,但是实际上一个ES里面存储的数据又何止千千万,他们就是通过分词来实现的。
在 Elasticsearch(ES)中,分词(Tokenization) 是文本处理流程中的核心环节,它将原始文本(如一句话、一段文档)拆分成一个个有意义的最小单元(称为 词项 / Token),这些词项会被存入倒排索引,成为后续搜索匹配的基础。简单来说,分词的目的是:将人类可理解的自然语言,转化为机器可高效检索的 “索引词”,同时兼顾语义准确性和搜索效率。
一、分词的基本流程
ES 的分词过程通常包含三个主要步骤,由 分词器(Analyzer) 统一完成:
- 字符过滤(Character Filter)对原始文本进行预处理,比如去除 HTML 标签、替换特殊字符(如将 “&” 替换为 “and”)等。例:将
<p>Hello, World!</p> 处理为 Hello, World!。 - 分词(Tokenizer)将过滤后的文本按规则拆分成词项(Token)。拆分规则可能基于空格、标点、特定语言的语法(如中文的词语边界)等。例:将 “Hello, World!” 拆分为
["Hello", "World"];将 “我爱 elasticsearch” 拆分为 ["我", "爱", "elasticsearch"](需中文分词器支持)。 - 词项过滤(Token Filter)对拆分后的词项进行二次处理,常见操作包括:
- 小写转换(如 “Hello”→“hello”)
- 去除停用词(如英文的 “the”“is”,中文的 “的”“了”)
- 词干提取(如 “running”→“run”)
- 同义词替换(如 “高兴”→“开心”)
二、ES 中的分词器类型
ES 内置了多种分词器,适用于不同场景,也支持自定义分词器:
1. 内置分词器(常用)
- Standard Analyzer(默认):按 Unicode 标准拆分文本,去除标点,将词转为小写,适用于大多数语言(但对中文支持较差,会逐字拆分)。
例:“Quick Brown Foxes!” →
["quick", "brown", "foxes"]。 - Simple Analyzer:按非字母字符拆分,将词转为小写(比 Standard 更简单,不处理词干)。例:“Hello, World! 123” →
["hello", "world"]。 - Whitespace Analyzer:仅按空格拆分,不做小写转换或其他处理,保留原始字符。例:“Hello World! 你好” →
["Hello", "World!", "你好"]。 - Stop Analyzer:在 Simple Analyzer 基础上,去除停用词(如英文的 “a”“an”“the”)。例:“The quick brown fox” →
["quick", "brown", "fox"]。 - Keyword Analyzer:不做任何分词,将整个文本作为一个词项(适用于精确匹配,如 ID、手机号)。例:“Hello World” →
["Hello World"]。
2. 中文分词器(需额外安装)
由于中文没有空格分隔,且词语边界模糊(如 “南京市长江大桥” 可拆分为 “南京市 / 长江大桥” 或 “南京 / 市长 / 江大桥”),内置分词器无法满足需求,需使用专门的中文分词器:
- IK Analyzer:最常用的中文分词器之一,支持 “智能分词”(粗粒度)和 “最大词长分词”(细粒度),可自定义词典(添加行业术语)。例:“我爱北京天安门” → 智能分词:["我", "爱", "北京", "天安门"]。
- HanLP Analyzer:基于 HanLP 自然语言处理库,支持更精准的分词、词性标注、命名实体识别(如人名、地名)。
- Jieba Analyzer:移植自 Python 的 Jieba 分词,支持自定义词典和并行分词,适合处理大量中文文本。
这里通过分词的介绍,就是为了让大家更好地理解ES实现快速搜索的底层技术原理。