跳至主要內容

Elasticsearch分词器

xw大约 3 分钟ElasticsearchElasticsearch

概述

分词器(Tokenizer)是Elasticsearch中用于将文本分割成词项(Tokens)的组件。它是在索引和搜索过程中对文本进行处理的关键部分。分词器将原始文本输入,按照一定的规则将其分割成有意义的词项,以便进行索引和搜索。

Elasticsearch提供了多种内置的分词器,以满足不同语言和需求的分词处理。以下是一些常用的分词器:

  • Standard分词器:适用于大多数语言的默认分词器。它将文本按照空格和标点符号进行分割,并进行小写转换、去除停用词等处理。
  • Whitespace分词器:根据空格字符进行简单的分割,不进行其他处理。
  • Keyword分词器:将整个文本作为单个词项进行索引和搜索,不进行分割。
  • Simple分词器:按照非字母字符进行分割,并进行小写转换。
  • Language分词器:针对特定语言的分词器,如English、Chinese等。它们使用特定的规则和字典来处理相应语言的文本。
  • Stop分词器:stop 分析器 和 simple 分析器很像,唯⼀不同的是,stop 分析器增加了对删除停⽌词的⽀ 持,默认使⽤了english停⽌词,stopwords 预定义的停⽌词列表,⽐如 (the,a,an,this,of,at)等等
  • Pattern分词器:⽤正则表达式来将⽂本分割成terms,默认的正则表达式是\W+(⾮单词字符)

使用

示例使用

使用Whitespace分词器示例:

## 创建索引,这里自定了一个分词器,实际是使用whitespace
PUT /inde-aaa/
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my-analyzer":{
          "type": "whitespace"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content":{
        "type": "text",
        "analyzer": "my-analyzer"
      },
      "name":{
        "type": "keyword"
      }
    }
  }
}

## 插入测试数据
POST /inde-aaa/_doc/1
{
  "name":"xw",
  "content":"hello world"
}

## 测试查询
GET /inde-aaa/_search
{
  "query": {
    "match": {
      "content": "world"
    }
  }
}

中文分词器

在Elasticsearch中,有多种中文分词器可用于将中文文本进行分词处理。以下是一些常用的中文分词器:

  1. Smartcn分词器:Smartcn是Elasticsearch自带的中文分词器之一。它基于Lucene的中文分词器,能够进行智能分词,具备较好的中文分词效果。
  2. IK分词器:IK是一款开源的中文分词器,也是Elasticsearch常用的中文分词器之一。它提供了细粒度和智能两种分词模式,支持中文词典扩展和自定义词典的功能。
  3. Jieba分词器:Jieba是Python中常用的中文分词库,也有对应的Elasticsearch插件。它基于统计算法和词典匹配,能够进行精确分词和全模式分词。
  4. Ansj分词器:Ansj是一款开源的中文分词器,提供了多种分词模式和分词算法。它具备较高的分词速度和较好的分词效果。

以IK分词器使用为例,

  1. 首先需要安装ik分词器插件,由于我是容器部署的ES,可以直接进入容器进行安装:

    ## 进入容器
    docker exec -it elasticsearch bash
    
    ## 安装分词器
     ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-analysis-ik-7.14.0.zip
    
    ##退出容器
    exit
    
    ##重启es
    docker restart elasticsearch
    
    
    
  2. 创建索引

    PUT /inde-bbb/
    {
      "mappings": {
        "properties": {
          "content":{
            "type": "text",
             "analyzer": "ik_max_word",
            "search_analyzer": "ik_smart"
          },
          "name":{
            "type": "keyword"
          }
        }
      }
    }
    
  3. 添加测试数据

    POST /inde-bbb/_doc/1
    {
      "name":"xw",
      "content":"向往好好学习天天向上"
    }
    
  4. 测试查询结果如下图所示:

    image-20230703221340167