Skip to content
章节导航

搜索引擎的分词和 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 是一种数据类型,表示一个字符串字段只包含字母和数字,并且不会进行任何其他的分词或处理;
    • 它会忽略字段中的任何非字母数字字符(如标点符号、空格等),只保留字母和数字字符
  • 单词在原始文本中的位置(position)