ElasticSearch分词介绍!

分词是指将文本转换成一系列单词的过程,也叫做文本分析。

举一个分词简单的例子:

比如你输入 Mastering Elasticsearch,会自动帮你分成两个单词:

  • 一个是 mastering
  • 另一个是 elasticsearch
  • 可以看出单词也被转化成了小写的

索引和搜索分词

文本分词会发生在两个地方:

  • 创建索引:
    • 当索引文档字符类型为text时,在建立索引时将会对该字段进行分词。
  • 搜索:
    • 当对一个text类型的字段进行全文检索时,会对用户输入的文本进行分词。

分词器测试

可以通过_analyzerAPI来测试分词的效果。

1
2
3
4
5
6
7
COPY# 过滤html 标签
POST _analyze
{
"tokenizer":"keyword", #原样输出
"char_filter":["html_strip"], # 过滤html标签
"text":"<b>hello world<b>" # 输入的文本
}

指定分词器

创建索引时指定分词器:

如果设置手动设置了分词器,ES将按照下面顺序来确定使用哪个分词器:

  • 先判断字段是否有设置分词器,如果有,则使用字段属性上的分词器设置。
  • 如果设置了analysis.analyzer.default,则使用该设置的分词器。
  • 如果上面两个都未设置,则使用默认的standard分词器。

字段指定分词器:

title属性指定分词器:

1
2
3
4
5
6
7
8
9
10
11
COPYPUT my_index
{
"mappings": {
"properties": {
"title":{
"type":"text",
"analyzer": "whitespace"
}
}
}
}

设置默认分词器:

1
2
3
4
5
6
7
8
9
10
11
12
COPYPUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"default":{
"type":"simple"
}
}
}
}
}

搜索时如何确定分词器:

在搜索时,通过下面参数依次检查搜索时使用的分词器:

  • 搜索时指定analyzer参数。
  • 创建mapping时指定字段的search_analyzer属性。
  • 创建索引时指定settinganalysis.analyzer.default_search。
  • 查看创建索引时字段指定的analyzer属性。
  • 如果上面几种都未设置,则使用默认的standard分词器。

指定analyzer:

搜索时指定analyzer查询参数。

1
2
3
4
5
6
7
8
9
10
11
COPYGET my_index/_search
{
"query": {
"match": {
"message": {
"query": "Quick foxes",
"analyzer": "stop"
}
}
}
}

指定字段analyzer

1
2
3
4
5
6
7
8
9
10
11
12
COPYPUT my_index
{
"mappings": {
"properties": {
"title":{
"type":"text",
"analyzer": "whitespace",
"search_analyzer": "simple"
}
}
}
}

指定默认default_seach

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
COPYPUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"default":{
"type":"simple"
},
"default_seach":{
"type":"whitespace"
}
}
}
}
}

内置分词器

分词器 说明
Standard Analyzer 默认分词器,按词切分,小写处理,停用词处理默认关闭
Simple Analyzer 按照非字母切分,非字母的都被去除,小写处理
Stop Analyzer 小写处理,停用词过滤
Whitespace Analyzer 按照空格切分,不转小写
Keyword Analyzer 不分词,直接将输入内容进行输出
Pattern Analyzer 正则表达式,默认\W+(非字母符号分割)
Language 提供30多种常见语言的分词器
Customer Analyzer 自定义分词器
分析器 描述 分词对象 结果
standard 标准分析器是默认的分析器,如果没有指定,则使用该分析器。
它提供了基于文法的标记化(基于 Unicode 文本分割算法,如 Unicode 标准附件 # 29所规定) ,并且对大多数语言都有效。
The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog’s, bone ]
simple 简单分析器将文本分解为任何非字母字符的标记,如数字、空格、连字符和撇号、放弃非字母字符,并将大写字母更改为小写字母。 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
whitespace 空格分析器在遇到空白字符时将文本分解为术语 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog’s, bone. ]
stop 停止分析器与简单分析器相同,但增加了删除停止字的支持。默认使用的是 _english_ 停止词。 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ quick, brown, foxes, jumped, over, lazy, dog, s, bone ]
keyword 不分词,把整个字段当做一个整体返回 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone.]
pattern 模式分析器使用正则表达式将文本拆分为术语。正则表达式应该匹配令牌分隔符,而不是令牌本身。正则表达式默认为 w+ (或所有非单词字符)。 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
多种西语系 arabic, armenian, basque, bengali, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english等等 一组旨在分析特定语言文本的分析程序。

中文分词

中文分词器最简单的是ik分词器,还有jieba分词,哈工大分词器等。

分词器 描述 分词对象 结果
ik_smart ik分词器中的简单分词器,支持自定义字典,远程字典 学如逆水行舟,不进则退 [学如逆水行舟,不进则退]
ik_max_word ik_分词器的全量分词器,支持自定义字典,远程字典 学如逆水行舟,不进则退 [学如逆水行舟,学如逆水,逆水行舟,逆水,行舟,不进则退,不进,则,退]