Elasticsearch 分析器analyzers

2022-07-16 09:45:40

目录

摘要:

一:认识analyzers三大组件

1.Character filters (字符过滤器)

2.Tokenizer (分词器)

3.Token filters (token过滤器)

 二:各种分析器Analyzer 介绍

2.1Standard Analyzer(标准分析器)

    2.11拓展标准分析器的语法

2.12 自定义分析器的语法

2.2Simple Analyzer

2.21Simple Analyzer组成

 2.3Whitespace Analyzer

2.3.1 Whitespace Analyzer 组成

2.4Stop Analyzer

Configuration

 2.4.1其组成部分

2.4.2用户自定义

2.5Keyword Analyzer

2.5.1keyword analyzer组成部分

2.5.2 keyword analyzer自定义

2.6Pattern Analyzer

2.6.1组成部分

2.6.2可拓展支持的参数

2.6.3拓展例子

2.6.4用户自定义

2.7 Fingerprint Analyzer

2.7.1 拓展参数

2.7.2 拓展语法

 2.7.3组成部分

2.7.4自定义语法

2.8 Custom Analyzer(用户自定义分析器)

2.8.1 自定义分析器的组成

2.9自定义语法两个例子



摘要:

   本人最近频繁用到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

Token Filters

    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分析器的自带参数为:

max_token_length

最大term长度。如果看到term超过此长度,则将其max_token_length间隔分割。默认为255

stopwords

预定义的停用词列表,例如_english_或包含停用词列表的数组。默认为_none_。默认情况下,没有停用词。我们可以在自定义analyzer的时候对stardard analyzer进行拓展,下面的例子展示了这样的用法。

stopwords_path

包含停用词的文件的路径。

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

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

Thestop analyzer accepts the following parameters:

stopwords

A pre-defined stop words list like_english_ or an array containing a list of stop words. Defaults to_english_.

stopwords_path

The path to a file containing stop words. This path is relative to the Elasticsearchconfig directory.

下面是拓展案例:

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组成部分

Thekeyword 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

2.6.2可拓展支持的参数

pattern

AJava regular expression, defaults to\W+.

flags

Java regular expressionflags. Flags should be pipe-separated, eg"CASE_INSENSITIVE|COMMENTS".

lowercase

Should terms be lowercased or not. Defaults totrue.

stopwords

A pre-defined stop words list like_english_ or an array containing a list of stop words. Defaults to_none_.

stopwords_path

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分析器接受以下参数:

separator

用于连接术语的字符。默认为空格。

max_output_size

发出的最大令牌大小。默认为255。大于此大小的令牌将被丢弃。

stopwords

预定义的停用词列表,例如_english_或包含停用词列表的数组。默认为_none_

stopwords_path

包含停用词的文件的路径。

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)

2.7.4自定义语法

PUT /fingerprint_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_fingerprint": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding",
            "fingerprint"
          ]
        }
      }
    }
  }
}

2.8 Custom Analyzer(用户自定义分析器)

上面的各种分析器基本也都讲解的自定义的语法,现在来系统讲一下自定义分析器的详细知识。

2.8.1 自定义分析器的组成

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 ]
  • 作者:会飞的鱼干干
  • 原文链接:https://blog.csdn.net/qq_36066039/article/details/101454153
    更新时间:2022-07-16 09:45:40