您的位置:

详解elasticsearch分词器

一、简介

随着云计算和大数据的普及,搜索引擎已经成为当今互联网技术的重要组成部分。elasticsearch作为开源全文搜索引擎,其分词器作为搜索引擎的核心组件,具有重要的作用。elasticsearch的分词器主要有以下三个部分:

  1. 字符过滤器:对原始输入和标记化的术语进行字符级处理,比如删除HTML标签、转换字符编码
  2. 分词器:将输入的文本拆分成单个单词(词项)的过程
  3. 标记过滤器:修改、删除或添加特定标记,比如stemming、lowercasing、stopwords

二、分词器的分类

elasticsearch分词器按照不同的算法可分为五种:

  1. Standard Analyzer(标准分词器):按照非字母符号或空格分词
  2. Simple Analyzer(简单分词器):按照非字母符号或空格分词,并忽略大小写
  3. Whitespace Analyzer(空格分词器):按照空格分词
  4. Keyword Analyzer(关键字分词器):将输入视作一个单一术语,常用于过滤或精确匹配查询
  5. Language-specific Analyzers(特定语言分词器):基于不同语言的特点进行分词,如中文分词、德语分词、法语分词等

三、中文分词器的使用

中文分词是一项复杂的任务,elasticsearch提供了多种中文分词器,比如IK分词器和smartcn分词器。下面是使用IK分词器进行中文分词的代码示例:

$ curl -X PUT "localhost:9200/test" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ik_max_word": { 
          "type": "custom",
          "tokenizer": "ik_max_word"
        },
        "ik_smart": {
          "type": "custom",
          "tokenizer": "ik_smart"
        }
      }
    }
  }
}
'

$ curl -X GET "localhost:9200/test/_analyze?pretty=true" -H 'Content-Type: application/json' -d'
{
  "analyzer": "ik_max_word",
  "text": "我是一名全能编程开发工程师"
}
'

// 返回结果:
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "一名",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "全能",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "编程",
      "start_offset" : 6,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "开发",
      "start_offset" : 8,
      "end_offset" : 10,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "工程师",
      "start_offset" : 10,
      "end_offset" : 13,
      "type" : "CN_WORD",
      "position" : 6
    }
  ]
}

四、标记过滤器的使用

标记过滤器用于修改、删除或添加特定标记,比如stemming、lowercasing、stopwords。下面是使用stopwords标记过滤器过滤“我是一个全能编程开发工程师”中停用词的代码示例:

PUT /stopwords_test
{
  "settings": {
    "analysis": {
      "filter": {
        "my_stopwords": {
          "type": "stop",
          "stopwords": ["我", "是", "一个"]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "filter": ["lowercase", "my_stopwords"]
        }
      }
    }
  }
}

GET /stopwords_test/_analyze
{
  "analyzer": "my_analyzer",
  "text": "我是一个全能编程开发工程师"
}

// 返回结果:
{
  "tokens": [
    {
      "token": "全能",
      "start_offset": 5,
      "end_offset": 7,
      "type": "",
      "position": 3
    },
    {
      "token": "编程",
      "start_offset": 7,
      "end_offset": 9,
      "type": "
   ",
      "position": 4
    },
    {
      "token": "开发",
      "start_offset": 9,
      "end_offset": 11,
      "type": "
    ",
      "position": 5
    },
    {
      "token": "工程师",
      "start_offset": 11,
      "end_offset": 14,
      "type": "
     ",
      "position": 6
    }
  ]
}

     
    
   
  

五、结尾

以上是elasticsearch分词器的基本介绍和使用方法。不同的分词器和标记过滤器的使用场景不同,可以根据不同情况进行选择使用。希望这篇文章能够帮助到使用elasticsearch的开发工程师。