笔记六:通过 Analyzer 进行分词

Anaiysis 与 Analyzer

  • Analysis - 文本分析是吧全文本转换成一系列的单词(term / token)的过程,也叫分词
  • Analysis 是通过Analyzer来实现的
    • 可使用Elasticesearch 内置的分析器 或者按需求定制化分析器
  • 除了在数据写入时转换词条,匹配Query语句时候也需要用相同的分析器会查询语句进行分析

Analyzer 的组成

  • 分词器是专门处理分词的组件,Analyzer 由三部分组成
    • Character Filters (针对原始文本处理,例如去除html)
    • Tokenizer(按照规则切分为单词)
    • Token Filter (将切分的单词进行加工,小写,删除stopwords,增加同义语)

ES 笔记六:通过 Analyzer 进行分词

Elastocsearch 的内置分词器

  • Standard Analyzer - 默认分词器,按词切分,小写处理
  • Simple Analyzer - 按照非字母切分(符号被过滤),小写处理
  • Stop Analyzer - 小写处理,停用词过滤(the ,a,is)
  • Whitespace Analyzer - 按照空格切分,不转小写
  • Keyword Analyzer - 不分词,直接将输入当做输出
  • Patter Analyzer - 正则表达式,默认 \W+
  • Language - 提供了30多种常见语言的分词器
  • Customer Analyzer 自定义分词器

使用 _analyzer Api

  • 直接指定Analyzer 进行测试
     GET _analyze
     {
       "analyzer": "standard",
       "text" : "Mastering Elasticsearch , elasticsearch in Action"
     }
     //返回结果
     {
       "tokens" : [
         {
           "token" : "mastering",
           "start_offset" : 0,
           "end_offset" : 9,
           "type" : "<ALPHANUM>",
           "position" : 0
         },
         {
           "token" : "elasticsearch",
           "start_offset" : 10,
           "end_offset" : 23,
           "type" : "<ALPHANUM>",
           "position" : 1
         },
         {
           "token" : "elasticsearch",
           "start_offset" : 26,
           "end_offset" : 39,
           "type" : "<ALPHANUM>",
           "position" : 2
         },
         {
           "token" : "in",
           "start_offset" : 40,
           "end_offset" : 42,
           "type" : "<ALPHANUM>",
           "position" : 3
         },
         {
           "token" : "action",
           "start_offset" : 43,
           "end_offset" : 49,
           "type" : "<ALPHANUM>",
           "position" : 4
         }
       ]
     }
  • 指定索引的字段进行测试

    POST books/_analyze
    {
    "field": "title",
    "text": "Mastering Elasticesearch"
    }
  • 自定义分词进行测试

      POST /_analyze
      {
        "tokenizer": "standard", 
        "filter": ["lowercase"],
        "text": "Mastering Elasticesearch"
      }
      //结果返回
      {
        "tokens" : [
          {
            "token" : "mastering",
            "start_offset" : 0,
            "end_offset" : 9,
            "type" : "<ALPHANUM>",
            "position" : 0
          },
          {
            "token" : "elasticesearch",
            "start_offset" : 10,
            "end_offset" : 24,
            "type" : "<ALPHANUM>",
            "position" : 1
          }
        ]
      }

Standard Analyzer

  • 默认的分词器
  • 按词切分
  • 小写处理
    #standard
    GET _analyze
    {
    "analyzer": "standard",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }    

ES 笔记六:通过 Analyzer 进行分词

Simple Analyzer

  • 按照非字母切分,非字母的都被去除
  • 小写处理
    #simple 去除非字母的 :2 -  xi
    GET _analyze
    {
    "analyzer": "simple",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

Whitespace Analyzer

  • 空格切分
    #stop
    GET _analyze
    {
    "analyzer": "whitespace",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }
    ES 笔记六:通过 Analyzer 进行分词

Stop Analyzer

  • 相比 Simple Analyzer
  • 多了stop filter
    • 后把 the ,a, is,in 等修饰性词语去除
      GET _analyze
      {
      "analyzer": "stop",
      "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
      }

ES 笔记六:通过 Analyzer 进行分词

Keyword Analyzer

  • 不分词,直接将输入当作一个term输出
    #keyword
    GET _analyze
    {
    "analyzer": "keyword",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

ES 笔记六:通过 Analyzer 进行分词

Pattern Analyzer

  • 通过正则表达进行分词
  • 默认是\W+,非字符的符号进行分隔
    GET _analyze
    {
    "analyzer": "pattern",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

ES 笔记六:通过 Analyzer 进行分词

Language Analyzer

  • 各国语言分词
    #english
    GET _analyze
    {
    "analyzer": "english",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

中文分词的难点

  • 中文句子,切分成一个一个次(不是一个个字)
  • 英文中,单词有自然的空格作为分隔
  • 一句中文,在不同的上下文,有不同的理解
    • 这个苹果,不大好吃 / 这个苹果,不大,好吃!
  • 一些例子
    • 他说的确实在理 / 这事的确定不下来

ICU Analyzer

  • 需要安装plugin
    • Elasticsearch-plugin install analysis
    • 提过了Unicode的支持,更好的支持亚洲语言!

ES 笔记六:通过 Analyzer 进行分词

给docker-compose安装的es安装插件

    cd /var/docker/docker-es-7.3/
    docker exec -it es7_01 bash
    bin/elasticsearch-plugin install analysis-icu
    exit
    docker exec -it es7_02 bash
    bin/elasticsearch-plugin install analysis-icu
    exit
    docker-compose restart

#icu analyzer    
POST _analyze
{
  "analyzer": "icu_analyzer",
  "text": "他说的确实在理”"
}

更多的中文分词器

es
本作品采用《CC 协议》,转载必须注明作者和本文链接
快乐就是解决一个又一个的问题!
CrazyZard
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!