目录
摘要:
本人最近频繁用到Elasticsearch 分析器,因此准备将官网所讲解的整个模块的内容做一个详细的整理,翻译,测试!整个过程可能会持续比较长的时间,因此这篇文章会持续更新,一方面是为了做笔记,一方面方便大家查看。首先要了解什么是分析器,es的分析器由三部分组成,分别:
Character filters (字符过滤器)Tokenizer (分词器) Token filters (token过滤器)
一:认识analyzers三大组件
1.Character filters (字符过滤器)
字符过滤器以字符流的形式接收原始文本,并可以通过添加、删除或更改字符来转换该流。
举例来说,一个字符过滤器可以用来把阿拉伯数字(٠١٢٣٤٥٦٧٨٩)转成成Arabic-Latin的等价物(0123456789)。
一个分析器可能有0个或多个字符过滤器,它们按顺序依次生效。功能是针对流入的字符流进行预处理。
2.Tokenizer (分词器)
分词器接收被Character filters 预处理后的字符流,并将其拆分成单个token (通常是单个单词),同时生成词频信息,以及随影词频搜索的索引信息,这其实就是es搜索的核心。这部分工作是luence完成的,简单来说有了词项term 词频才能生成可以被检索的数据结构。
3.Token filters (token过滤器)
token过滤器接收的是被Tokenizer (分词器)分好的字符流,针对分词器处理后的一个个的单词,token filter可以进一步处理,并且可能会添加、删除或更改tokens。对于搜索来说没社么价值的单词就可以在这里被去掉,比如说 a an the 等等。另外,一个lowercase token filter可以将所有的token转成小写。stop token filter可以删除常用的单词,比如 the 。synonym token filter可以将同义词引入token流。 所以说传入es中的数据经过Character filters (字符过滤器)>Tokenizer (分词器)>Token filters (token过滤器) 之后才会正式的去生成索引结构。下面粘贴一下官网的一个例子,你可以先熟悉一下,首先说明一点,analyzers要在setting中进行设置。
//analysis属性中可以添加多个分析器analyzer,在我们下面的例子中只有一个
//仔细想想就知道,我们可以让不同的字段用不同的分析器analyzer,每一个analyzer都有一个唯一的名字。
//下面的analyzer的名字是std_folded,这个名字就是可以在其他字段引用的唯一标识。
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"std_folded": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings": {
"properties": {
"my_text": {
"type": "text",
"analyzer": "std_folded"
}
}
}
}
GET my_index/_analyze
{
"analyzer": "std_folded",
"text": "Is this déjà vu?"
}
GET my_index/_analyze
{
"field": "my_text",
"text": "Is this déjà vu?"
}
二:各种分析器Analyzer 介绍
2.1Standard Analyzer(标准分析器)
standard
分析器是默认分析器,如果未指定,则使用该分析器,适用于大多数语言。分割算法用的是http://unicode.org/reports/tr29/,有兴趣的读者可以去了解,我大概看了一下比较复杂。通俗来说就是以非字符未边界进行string的切割。
standard 由下面组成:
Tokenizer
- Standard Tokenizer(标准分词器)
Token Filters
- Lower Case Token Filter(将词项term全部转化为小写)
- Stop Token Filter (disabled by default)(默认没有开启停用词)
2.11拓展标准分析器的语法
拓展语法,是针对已有的分析器,对其默认的属性进行一个更改,主要参数是:
- type 指定要拓展的分析器是什么分析器
- 该分析器的系统自带的参数: 语法为: param:值
POST _analyze
{
"analyzer": "standard",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
输出结果为:[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]
所述standard
分析器的自带参数为:
| 最大term长度。如果看到term超过此长度,则将其 |
| 预定义的停用词列表,例如 |
| 包含停用词的文件的路径。 |
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"type": "standard",
"max_token_length": 5,
"stopwords": "_english_"
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_english_analyzer",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
Copy as cURL
View in Console
#可以看到拓展了standard analyzer之后,the 这个英文单词被"stopwords": "_english_"干掉了:
[ 2, quick, brown, foxes, jumpe, d, over, lazy, dog's, bone ]
2.12 自定义分析器的语法
自定义语法:分析器有三个模块,你可以自定义就行了,看下面的例子
PUT /standard_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_standard": { ---》这是自定义的分析器的name
"tokenizer": "standard", ---》这是token分词器
"filter": [ ---》这是token词项过滤器可以有多个
"lowercase"
]
}
}
}
}
}
// 分析器三大组件 字符过滤器 token分词器 token 词项过滤器
2.13 standard Analyze组成部分
Tokenizer
Token Filters
- Lower Case Token Filter
- Stop Token Filter (disabled by default)
2.2Simple Analyzer
当simple
分析器遇到非字母的字符时,它会将文本分解为多个词。所有术语均小写。该simple
分析仪是不支持拓展配置。也就是说下面用type参数拓展simple分析器是无效的。这一点要注意,注意看下面的例子:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"type": "simple"
}
}
}
}
}
//虽然不支持拓展,但是支持自定义,下面是正确的自定义方式
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"tokenzer": "lowercase"
}
}
}
}
}
//当tokerzer为 lowercase其实就是simple Analyzer分析器的自定义,因为simple Analyzer的组成部分就是lowercase tokenzer
2.21Simple Analyzer组成
simple Analyzer组成部分如下:
Tokenizer
2.3Whitespace Analyzer
Whitespace Analyzer用空格分割string生成词项,该whitespace
分析仪是和simple Analyzer一样都是不可拓展的,但是可以自定义,语法如下。
PUT /whitespace_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_whitespace": {
"tokenizer": "whitespace",
"filter": [
]
}
}
}
}
}
2.3.1 Whitespace Analyzer 组成
Tokenizer
2.4Stop Analyzer
该stop Analyzer和
simple
分析 基本一样,但增加了对stopwords。默认情况下使用 _english_
停用词.且支持拓展和自定义,拓展参数如下。(自定义和拓展其实大概意思一样,都是定义生成一个新的analyzer,只是前者事通过type 和参数拓展,后者事根据其组成部分的组件自定义。若你看不懂这句话,可以多看看想想)
Configuration
The stop
analyzer accepts the following parameters:
| A pre-defined stop words list like |
| The path to a file containing stop words. This path is relative to the Elasticsearch |
下面是拓展案例:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_stop_analyzer": {
"type": "stop",
"stopwords": ["the", "over"]
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_stop_analyzer",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
#下面是结果:
[ quick, brown, foxes, jumped, lazy, dog, s, bone ]
2.4.1其组成部分
It consists of:
Tokenizer
Token filters
simple Analyser 只包含 Lower Case Tokenizer,stop Analyzer 除了包含Lower Case Tokenizer之外,还有Stop Token Filter
2.4.2用户自定义
PUT /stop_example
{
"settings": {
"analysis": {
"filter": {#这是自定义的filter 后面再讲解
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
},
"analyzer": {
"rebuilt_stop": {
"tokenizer": "lowercase",
"filter": [ #使用自定义的toker filter,这是一个数组可以有多个
"english_stop"
]
}
}
}
}
}
#The default stopwords can be overridden with the stopwords or stopwords_path parameters.
#You’d add any token filters after english_stop.
2.5Keyword Analyzer
该keyword
分析器是“ noop ”分析器,不支持拓展没有额外拓展参数,但是支持自定义。它将整个输入字符串作为单个令牌返回。 也就是说对你输入的字符串,在生成索引token的时候,不会做任何处理,也就是说,你输入的是 "welcom beijing",在以前的时候生成两个词项,“welcom" "beiijing",现在只会生成一个词项“welcom beijing”,也就是说在任何时候你搜索的时候只搜索“welcom”,或者是“beijing”的时候根本不可能搜索出来,因为底层索引的是“welcom beijing” 。这种分析器适用于精确索引某一个字段,提供精准搜索。
2.5.1keyword analyzer组成部分
The keyword
analyzer consists of:
Tokenizer
2.5.2 keyword analyzer自定义
PUT /keyword_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_keyword": {
"tokenizer": "keyword",
"filter": [
]
}
}
}
}
}
2.6Pattern Analyzer
pattern
分析仪使用一个正则表达式的分析仪。正则表达式默认为\W+
(或所有非单词字符),正则分析器支持拓展也支持自定义。这个功能是解决特殊情况下的分此,我就遇到过。比如你想用“/”或者是任何空白字符,包括空格、制表符、换页符等等进行分词设置,那么就可以自定义如下。
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_email_analyzer": {
"type": "pattern",
"pattern": "[/\\s]",
"lowercase": true
}
}
}
}
}
2.6.1组成部分
Tokenizer
Token Filters
- Lower Case Token Filter
- Stop Token Filter (disabled by default)
2.6.2可拓展支持的参数
| A Java regular expression, defaults to |
| Java regular expression flags. Flags should be pipe-separated, eg |
| Should terms be lowercased or not. Defaults to |
| A pre-defined stop words list like |
| The path to a file containing stop words. |
2.6.3拓展例子
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_email_analyzer": {
"type": "pattern",
"pattern": "\\W|_",
"lowercase": true
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_email_analyzer",
"text": "John_Smith@foo-bar.com"
}
The above example produces the following terms:
[ john, smith, foo, bar, com ]
2.6.4用户自定义
PUT /pattern_example
{
"settings": {
"analysis": {
"tokenizer": {
"split_on_non_word": {
"type": "pattern",
"pattern": "\\W+"
}
},
"analyzer": {
"rebuilt_pattern": {
"tokenizer": "split_on_non_word",
"filter": [
"lowercase"
]
}
}
}
}
}
2.7 Fingerprint Analyzer
输入文本是小写的,经过规范化以删除扩展的字符,经过排序,重复数据删除并将其组合为单个标记。如果配置了停用词列表,停用词也将被删除。支持拓展也支持自定义。
2.7.1 拓展参数
所述fingerprint
分析器接受以下参数:
| 用于连接术语的字符。默认为空格。 |
| 发出的最大令牌大小。默认为 |
| 预定义的停用词列表,例如 |
| 包含停用词的文件的路径。 |
2.7.2 拓展语法
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_fingerprint_analyzer": {
"type": "fingerprint",
"stopwords": "_english_"
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_fingerprint_analyzer",
"text": "Yes yes, Gödel said this sentence is consistent and."
}
The above example produces the following term:
[ consistent godel said sentence yes ]
2.7.3组成部分
Tokenizer
Token Filters (in order)
- Lower Case Token Filter
- ASCII Folding Token Filter
- Stop Token Filter (disabled by default)
- Fingerprint Token Filter
2.7.4自定义语法
PUT /fingerprint_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_fingerprint": {
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding",
"fingerprint"
]
}
}
}
}
}
2.8 Custom Analyzer(用户自定义分析器)
上面的各种分析器基本也都讲解的自定义的语法,现在来系统讲一下自定义分析器的详细知识。
2.8.1 自定义分析器的组成
- zero or more character filters
- a tokenizer
- zero or more token filters.
2.9自定义语法两个例子
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard", --》要素1
"char_filter": [ --》要素2
"html_strip"
],
"filter": [ --》要素3
"lowercase",
"asciifolding"
]
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "Is this <b>déjà vu</b>?"
}
分析器的三大要素:character filter >>tokenizer>>token filter
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"char_filter": [
"emoticons"
],
"tokenizer": "punctuation",
"filter": [
"lowercase",
"english_stop"
]
}
},
"tokenizer": {
"punctuation": {
"type": "pattern",
"pattern": "[ .,!?]"
}
},
"char_filter": {
"emoticons": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
},
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "I'm a :) person, and you?"
}
The above example produces the following terms:
[ i'm, _happy_, person, you ]