Elasticsearch 分词器_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

无论是内置的剖析器(analyzer),照样自界说的剖析器(analyzer),都由三种构件块组成的:character filterstokenizerstoken filters

内置的analyzer将这些构建块预先打包到合适分歧言语和文本范例的analyzer中。

Character filters (字符过滤器)

字符过滤器以字符流的情势吸收原始文本,并能够经由历程增加、删除或变动字符来转换该流。

举例来说,一个字符过滤器能够用来把阿拉伯数字(٠‎١٢٣٤٥٦٧٨‎٩)‎转成成Arabic-Latin的等价物(0123456789)。

一个剖析器可能有0个或多个字符过滤器,它们按递次运用。

(PS:相似Servlet中的过滤器,或许拦截器,设想一下有一个过滤器链)

Tokenizer (分词器)

一个分词器吸收一个字符流,并将其拆分红单个token (通常是单个单词),并输出一个token流。比方,一个whitespace分词器当它看到空缺的时刻就会将文本拆分红token。它会将文本“Quick brown fox!”转换为[Quick, brown, fox!]

(PS:Tokenizer 卖力将文本拆分红单个token ,这里token就指的就是一个一个的单词。就是一段文本被支解成好几局部,相当于Java中的字符串的 split )

分词器还卖力纪录每一个term的递次或地位,和该term所透露表现的原单词的最先和完毕字符偏移量。(PS:文本被分词后的输出是一个term数组)

一个剖析器必需只能有一个分词器

Token filters (token过滤器)

token过滤器吸收token流,并且可能会增加、删除或变动tokens。

比方,一个lowercase token filter能够将一切的token转成小写。stop token filter能够删除经常运用的单词,好比 the 。synonym token filter能够将同义词引入token流。

不允许token过滤器变动每一个token的地位或字符偏移量。

一个剖析器可能有0个或多个token过滤器,它们按递次运用。

小结&回忆

  • analyzer(剖析器)是一个包,这个包由三局部组成,分别是:character filters (字符过滤器)、tokenizer(分词器)、token filters(token过滤器)
  • 一个analyzer能够有0个或多个character filters
  • 一个analyzer有且只能有一个tokenizer
  • 一个analyzer能够有0个或多个token filters
  • character filter 是做字符转换的,它吸收的是文本字符流,输出也是字符流
  • tokenizer 是做分词的,它吸收字符流,输出token流(文本拆分后酿成一个一个单词,这些单词叫token)
  • token filter 是做token过滤的,它吸收token流,输出也是token流
  • 因而可知,悉数analyzer要做的事变就是将文本拆分红单个单词,文本 ---->  字符  ---->  token

 

 这就好比是拦截器

 

 

1.  测试剖析器

analyze API 是一个对象,能够资助我们检察剖析的历程。(PS:相似于执行计划)

curl -X POST "192.168.1.134:9200/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "whitespace",
  "text":     "The quick brown fox."
}
'

curl -X POST "192.168.1.134:9200/_analyze" -H 'Content-Type: application/json' -d'
{
  "tokenizer": "standard",
  "filter":  [ "lowercase", "asciifolding" ],
  "text":      "Is this déja vu?"
}
'

输出:

{
    "tokens":[
        {
            "token":"The",
            "start_offset":0,
            "end_offset":3,
            "type":"word",
            "position":0
        },
        {
            "token":"quick",
            "start_offset":4,
            "end_offset":9,
            "type":"word",
            "position":1
        },
        {
            "token":"brown",
            "start_offset":10,
            "end_offset":15,
            "type":"word",
            "position":2
        },
        {
            "token":"fox.",
            "start_offset":16,
            "end_offset":20,
            "type":"word",
            "position":3
        }
    ]
}

能够看到,关于每一个term,纪录了它的地位和偏移量

2.  Analyzer

2.1.  设置装备摆设内置的剖析器

内置的剖析器不消任何设置装备摆设就能够直接运用。固然,默许设置装备摆设是能够变动的。比方,standard剖析器能够设置装备摆设为支撑住手字列表:

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "std_english": { 
          "type":      "standard",
          "stopwords": "_english_"
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "my_text": {
          "type":     "text",
          "analyzer": "standard", 
          "fields": {
            "english": {
              "type":     "text",
              "analyzer": "std_english" 
            }
          }
        }
      }
    }
  }
}
'

在这个例子中,我们基于standard剖析器来界说了一个std_englisth剖析器,同时设置装备摆设为删除预界说的英语住手词列表。背面的mapping中,界说了my_text字段用standard,my_text.english用std_english剖析器。因而,下面两个的分词效果会是如许的:

curl -X POST "localhost:9200/my_index/_analyze" -H 'Content-Type: application/json' -d'
{
  "field": "my_text", 
  "text": "The old brown cow"
}
'
curl -X POST "localhost:9200/my_index/_analyze" -H 'Content-Type: application/json' -d'
{
  "field": "my_text.english", 
  "text": "The old brown cow"
}
'

第一个因为用的standard剖析器,因而分词的效果是:[ the, old, brown, cow ]

第二个用std_english剖析的效果是:[ old, brown, cow ]

2.2.  Standard Analyzer (默许)

若是没有迥殊指定的话,standard 是默许的剖析器。它供应了基于语法的符号化(基于Unicode文本支解算法),适用于大多数言语。

比方:

curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dogu0027s bone."
}
'

上面例子中,那段文本将会输出以下terms:

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]

2.2.1.  设置装备摆设

规范剖析器接收以下参数:

  • max_token_length  :  最大token长度,默许255
  • stopwords  :  预界说的住手词列表,如_english_ 或 包罗住手词列表的数组,默许是 _none_
  • stopwords_path  :  包罗住手词的文件途径

2.2.2.  示例设置装备摆设

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "standard",
          "max_token_length": 5,
          "stopwords": "_english_"
        }
      }
    }
  }
}
'
curl -X POST "localhost:9200/my_index/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "my_english_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dogu0027s bone."
}
'

以上输出以下terms:

[ 2, quick, brown, foxes, jumpe, d, over, lazy, dog's, bone ]

2.2.3.  界说

standard剖析器由以下两局部组成:

Tokenizer

  • Standard Tokenizer

Token Filters

  • Standard Token Filter
  • Lower Case Token Filter
  • Stop Token Filter (默许被禁用)

你还能够自界说

curl -X PUT "localhost:9200/standard_example" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_standard": {
          "tokenizer": "standard",
          "filter": [
            "lowercase"       
          ]
        }
      }
    }
  }
}
'

2.3.  Simple Analyzer

 simple 剖析器当它碰到只需不是字母的字符,就将文本剖析成term,并且一切的term都是小写的。比方:

curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "simple",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dogu0027s bone."
}
'

输入效果以下:

[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

2.3.1.  自界说

curl -X PUT "localhost:9200/simple_example" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_simple": {
          "tokenizer": "lowercase",
          "filter": [         
          ]
        }
      }
    }
  }
}
'

2.4.  Whitespace Analyzer

whitespace 剖析器,当它碰到空缺字符时,就将文本剖析成terms

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-

示例:

curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dogu0027s bone."
}
'

输出效果以下:

[ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. ]

2.5.  Stop Analyzer

 stop 剖析器 和 simple 剖析器很像,独一分歧的是,stop 剖析器增加了对删除住手词的支撑。默许用的住手词是 _englisht_

(PS:意义是,假定有一句话“this is a apple”,并且假定“this” 和 “is”都是住手词,那末用simple的话输出会是[ this , is , a , apple ],而用stop输出的效果会是[ a , apple ],到这里就看出两者的区别了,stop 不会输出住手词,也就是说它不以为住手词是一个term)

(PS:所谓的住手词,能够理解为分隔符)

2.5.1.  示例输出

curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
    "analyzer": "stop",
    "text": "The 2 QUICK Brown-Foxes jumped over the lazy dogu0027s bone."
}
'

输出

[ quick, brown, foxes, jumped, over, lazy, dog, s, bone ]

2.5.2.  设置装备摆设

stop 接收以下参数:

  • stopwords  :  一个预界说的住手词列表(好比,_englisht_)或许是一个包罗住手词的列表。默许是 _english_
  • stopwords_path  :  包罗住手词的文件途径。这个途径是相对Elasticsearch的config目次的一个途径

2.5.3.  示例设置装备摆设

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stop_analyzer": {
          "type": "stop",
          "stopwords": ["the", "over"]
        }
      }
    }
  }
}
'

上面设置装备摆设了一个stop剖析器,它的住手词有两个:the 和 over

curl -X POST "localhost:9200/my_index/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "my_stop_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dogu0027s bone."
}
'

基于以上设置装备摆设,这个要求输入会是如许的:

[ quick, brown, foxes, jumped, lazy, dog, s, bone ]

2.6.  Pattern Analyzer

Java正则表达式来将文本支解成terms,默许的正则表达式是W (非单词字符)

2.6.1.  示例输出

curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "pattern",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dogu0027s bone."
}
'

因为默许依照非单词字符支解,因而输出会是如许的:

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

2.6.2.  设置装备摆设

pattern 剖析器接收以下参数:

  • pattern  :  一个Java正则表达式,默许 W
  • flags  :  Java正则表达式flags。好比:CASE_INSENSITIVE 、COMMENTS
  • lowercase  :  是不是将terms悉数转成小写。默许true
  • stopwords  :  一个预界说的住手词列表,或许包罗住手词的一个列表。默许是 _none_
  • stopwords_path  :  住手词文件途径

2.6.3.  示例设置装备摆设

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_email_analyzer": {
          "type":      "pattern",
          "pattern":   "\W|_", 
          "lowercase": true
        }
      }
    }
  }
}
'

上面的例子中设置装备摆设了依照非单词字符或许下划线支解,并且输出的term都是小写

curl -X POST "localhost:9200/my_index/_analyze" -H 'Content-Type: application/json' -d'
{
  "analyzer": "my_email_analyzer",
  "text": "John_Smith@foo-bar.com"
}
'

因而,基于以上设置装备摆设,本例输出以下:

[ john, smith, foo, bar, com ]

2.7.  Language Analyzers

支撑分歧言语情况下的文本剖析。内置(预界说)的言语有:arabic, armenian, basque, bengali, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english, finnish, french, galician, german, greek, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, persian, portuguese, romanian, russian, sorani, spanish, swedish, turkish, thai

2.8.  自界说Analyzer

前面也说过,一个剖析器由三局部组成:

  • zero or more character filters
  • a tokenizer
  • zero or more token filters

2.8.1.  实例设置装备摆设

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom", 
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}
'

3.  Tokenizer 

3.1.  Standard Tokenizer

curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
  "tokenizer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dogu0027s bone."
}
'

4.  中文分词器

4.1.  smartCN

一个简朴的中文或中英文夹杂文本的分词器

这个插件供应 smartcn analyzer 和 smartcn_tokenizer tokenizer,并且不需要设置装备摆设

# 装置
bin/elasticsearch-plugin install analysis-smartcn
# 卸载
bin/elasticsearch-plugin remove analysis-smartcn

下面测试一下

能够看到,“本日天色真好”用smartcn剖析器的效果是:

[ 本日 , 天色 , 真 , 好 ]

若是用standard剖析器的话,效果会是:

[ 今 ,天 ,气 , 真 , 好 ]

4.2.  IK分词器

下载对应的版本,这里我下载6.5.3

然后,在Elasticsearch的plugins目次下建一个ik目次,将适才下载的文件解压到该目次下

末了,重启Elasticsearch

接下来,照样用适才那句话来测试一下

输出效果以下:

{
    "tokens": [
        {
            "token": "本日天色",
            "start_offset": 0,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "本日",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "每天",
            "start_offset": 1,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "天色",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "真好",
            "start_offset": 4,
            "end_offset": 6,
            "type": "CN_WORD",
            "position": 4
        }
    ]
}

明显比smartcn要更好一点

5.  参考

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenfilters.html

https://github.com/medcl/elasticsearch-analysis-ik

 

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。