搜索引擎的分词和 ES 默认分词器
什么是搜索引擎的分词
- 在Elasticsearch 8.X中,分词(tokenization)是将文本内容拆分成独立的单词或词项(tokens)的过程
- 分词是搜索引擎在建立索引和执行查询时的关键步骤,将文本拆分成单词,并构建倒排索引,可以实现更好的搜索和检索效果。
- 分词规则是指定义如何将文本进行拆分的规则和算法
- Elasticsearch 使用一系列的分词器(analyzer)和标记器(tokenizer)来处理文本内容
案例
假设我们有两个产品标题:
Apple iPhone 12 Pro Max 256GB
Samsung Galaxy S21 Ultra 128GB
使用默认的标准分词器(Standard Tokenizer),这些标题会被分割为以下令牌:
标题1:["Apple", "iPhone", "12", "Pro", "Max", "256GB"]
标题2:["Samsung", "Galaxy", "S21", "Ultra", "128GB"]
分词的一般过程
常见的分词器,如 Standard 分词器、Simple 分词器、Whitespace 分词器、IK 分词等,还支持自定义分词器
标记化(Tokenization)
- 分词的第一步是将文本内容拆分成单个标记(tokens),标记可以是单词、数字、特殊字符等。
- 标记化过程由标记器(tokenizer)执行,标记器根据一组规则将文本切分为标记。
过滤(Filtering)
- 标记化后,标记会进一步被过滤器(filters)处理。
- 过滤器执行各种转换和操作,如转换为小写、去除停用词(stop words),词干提取(stemming),同义词扩展等。
倒排索引(Inverted Indexing)
- 分词处理完成后,Elasticsearch 使用倒排索引(inverted index)来存储分词结果。
- 倒排索引是一种数据结构,通过将标记与其所属文档进行映射,快速确定包含特定标记的文档。
查询匹配
- 当执行查询时,查询的文本也会进行分词处理。
- Elasticsearch 会利用倒排索引来快速查找包含查询标记的文档,并计算相关性得分。
默认的Standard分词器的分词规则
标点符号切分
- 标点符号会被删除,并将连字符分隔为两个独立的词。
- 例如:"Let's go!" 会被切分为 "Let", "s", "go"。
小写转换
- 所有的文本会被转换为小写形式。
- 例如:"Hello World" 会被切分为 "hello", "world"。
停用词过滤
- 停用词(stop words)是在搜索中没有实际意义的常见词,如 "a", "an", "the" 等。
- 停用词会被过滤掉,不会作为独立的词进行索引和搜索。
词干提取
- 通过应用 Porter2 词干提取算法,将单词还原为其原始形式。
- 例如,running -> run、swimming -> swim、jumped -> jump
词分隔
- 按照空格将文本切分成词项(tokens)
查看 ES 分词存储效果
使用analyze API 来对文本进行分词处理并查看分词结果,基本语法如下
shell
GET /_analyze
{
"analyzer": "分词器名称",
"text": "待分析的文本"
}案例
shell
#字段是text类型
POST /my_index/_analyze
{
"field": "title",
"text": "This is some text to analyze"
}
#字段是text类型
POST /my_index/_analyze
{
"field": "title",
"text": "朔风正在学习"
}
#字段是 keyword 类型
POST /my_index/_analyze
{
"field": "tags",
"text": "This is some text to analyze"
}
#字段是keyword类型
POST /my_index/_analyze
{
"field": "tags",
"text": ["This is","朔风","Spring Boot" ]
}每个分词结果对象包含
- 分词后的单词(token)
- 开始位置(start_offset)
- 结束位置(end_offset)
- 类型(type):
- ALPHANUM 是一种数据类型,表示一个字符串字段只包含字母和数字,并且不会进行任何其他的分词或处理;
- 它会忽略字段中的任何非字母数字字符(如标点符号、空格等),只保留字母和数字字符
- ALPHANUM 是一种数据类型,表示一个字符串字段只包含字母和数字,并且不会进行任何其他的分词或处理;
- 单词在原始文本中的位置(position)
朔风