概述
Elasticsearch自带多种内置分析器,可以在任何索引中使用而无需进一步配置:
- 标准分析器(Standard Analyzer)
标准分析器根据Unicode文本分割算法将文本划分为单词。它删除大多数标点符号,将术语转换为小写,并支持删除停用词。 - 简单分析器(Simple Analyzer)
简单分析器在遇到非字母字符时将文本划分为术语。它将所有术语转换为小写。 - 空格分析器(Whitespace Analyzer)
空格分析器在遇到任何空格字符时将文本划分为术语。它不将术语转换为小写。 - 停用词分析器(Stop Analyzer)
停用词分析器类似于简单分析器,但还支持删除停用词。 - 关键词分析器(Keyword Analyzer)
关键词分析器是一个“空操作”分析器,接受任何文本并以与输入相同的文本输出为单个术语。 - 模式分析器(Pattern Analyzer)
模式分析器使用正则表达式将文本拆分为术语。它支持大小写转换和停用词。 - 语言分析器(Language Analyzers)
Elasticsearch提供许多语言特定的分析器,如英语或法语。 - 指纹分析器(Fingerprint Analyzer)
指纹分析器是一种专业分析器,用于创建可以用于重复检测的指纹。
如果您找不到适合您需求的分析器,您可以创建一个自定义分析器,其中结合了适当的字符过滤器、分词器和标记过滤器。
指纹分析器(Fingerprint Analyzer)
指纹分析器实现了一个指纹算法,该算法被OpenRefine项目用于辅助聚类。
输入文本被转换为小写,规范化以删除扩展字符,排序、去重,并连接成一个单一的标记。如果配置了停用词列表,还将删除停用词。
输出示例
POST _analyze
{
"analyzer": "fingerprint",
"text": "Yes yes, Gödel said this sentence is consistent and."
}
上述句子将生成以下单一术语:
[ and consistent godel is said sentence this yes ]
配置
指纹分析器接受以下参数:
separator | 用于连接术语的字符。默认为一个空格。 |
---|---|
max_output_size | 要生成的最大标记大小。默认为255。超过此大小的标记将被丢弃。 |
stopwords | 预定义的停用词列表,如english,或包含停用词列表的数组。默认为none。 |
stopwords_path | 包含停用词的文件路径。 |
有关停用词配置的更多信息,请参阅停用词标记过滤器。
示例配置
在这个例子中,我们配置指纹分析器使用预定义的英语停用词列表:
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_fingerprint_analyzer": {
"type": "fingerprint",
"stopwords": "_english_"
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_fingerprint_analyzer",
"text": "Yes yes, Gödel said this sentence is consistent and."
}
上述例子生成以下术语:
[ consistent godel said sentence yes ]
定义
指纹分词器由以下组成:
分词器
标记过滤器(按顺序)
如果您需要在配置参数之外定制指纹分析器,那么您需要将其重新创建为自定义分析器并进行修改,通常是通过添加标记过滤器。这将重新创建内置的指纹分析器,并可作为进一步定制的起点使用:
PUT /fingerprint_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_fingerprint": {
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding",
"fingerprint"
]
}
}
}
}
}
关键词分析器(Keyword analyzer)
关键词分析器是一个“空操作”分析器,它将整个输入字符串作为单个标记返回。
输出示例
POST _analyze
{
"analyzer": "keyword",
"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. ]
配置
Keyword analyzer 不可配置。
定义
分词器
- 关键词分词器
如果您需要定制关键词分析器,那么您需要将其重新创建为自定义分析器并进行修改,通常是通过添加标记过滤器。通常情况下,当您希望字符串不被分割成标记时,应优先选择关键词类型。但如果您需要,这将重新创建内置的关键词分析器,您可以将其用作进一步定制的起点:
PUT /keyword_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_keyword": {
"tokenizer": "keyword",
"filter": [
]
}
}
}
}
}
语言分析器(*Language analyzers*)
一组旨在分析特定语言文本的分析器。支持以下类型:阿拉伯语、亚美尼亚语、巴斯克语、孟加拉语、巴西葡萄牙语、保加利亚语、加泰罗尼亚语、CJK(中日韩)语言、捷克语、丹麦语、荷兰语、英语、爱沙尼亚语、芬兰语、法语、加利西亚语、德语、希腊语、印地语、匈牙利语、印度尼西亚语、爱尔兰语、意大利语、拉脱维亚语、立陶宛语、挪威语、波斯语、葡萄牙语、罗马尼亚语、俄语、索拉尼语、西班牙语、瑞典语、土耳其语、泰语。
配置语言分析器
停用词
所有分析器都支持在配置中内部设置自定义停用词,或通过设置stopwords_path来使用外部停用词文件。详细信息请参见停用词分析器。
排除词干处理的词
stem_exclusion参数允许您指定一个小写单词数组,这些单词不应进行词干处理。在内部,此功能通过添加关键词标记过滤器来实现,其中关键词设置为stem_exclusion参数的值。
以下分析器支持设置自定义stem_exclusion列表:阿拉伯语、亚美尼亚语、巴斯克语、孟加拉语、保加利亚语、加泰罗尼亚语、捷克语、荷兰语、英语、芬兰语、法语、加利西亚语、德语、印度语、匈牙利语、印尼语、爱尔兰语、意大利语、拉脱维亚语、立陶宛语、挪威语、葡萄牙语、罗马尼亚语、俄语、索拉尼语、西班牙语、瑞典语、土耳其语。
重新实现语言分析器
内置语言分析器可以被重新实现为自定义分析器(如下所述),以定制其行为。
⚠️ 如果您不打算排除词语不进行词干处理(相当于上面的stem_exclusion参数),则应从自定义分析器配置中删除keyword_marker标记过滤器。
详细语言分析器参考原文,这里不赘述。
模式分析器(Pattern analyzer)
模式分析器使用正则表达式将文本拆分为术语。正则表达式应该匹配标记分隔符而不是标记本身。默认情况下,正则表达式为 \\W+
(或所有非单词字符)。
⚠️ 谨防病态正则表达式
模式分析器使用Java正则表达式。
糟糕编写的正则表达式可能运行非常缓慢,甚至可能引发StackOverflowError,并导致其运行的节点突然退出。详细了解有关病态正则表达式及如何避免的信息。
示例输出
POST _analyze
{
"analyzer": "pattern",
"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 ]
配置
模式分析器接受以下参数:
pattern | 一个Java正则表达式,默认为\W+。 |
---|---|
flags | Java正则表达式标志。标志应以竖线分隔,例如"CASE_INSENSITIVE |
lowercase | 术语是否应该转换为小写。默认为true。 |
stopwords | 预定义的停用词列表,如english,或包含停用词列表的数组。默认为none。 |
stopwords_path | 包含停用词的文件路径。 |
有关停用词配置的更多信息,请参阅停用词标记过滤器。
示例配置
在这个例子中,我们配置模式分析器,使用非单词字符或下划线(\W|_)来分割电子邮件地址,并将结果转换为小写:
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_email_analyzer": {
"type": "pattern",
"pattern": "\\\\W|_",
"lowercase": true
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_email_analyzer",
"text": "[email protected]"
}
上述例子生成以下术语:
[ john, smith, foo, bar, com ]
CamelCase分词器
以下是一个更复杂的例子,将CamelCase文本拆分为标记:
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"camel": {
"type": "pattern",
"pattern": "([^\\\\p{L}\\\\d]+)|(?<=\\\\D)(?=\\\\d)|(?<=\\\\d)(?=\\\\D)|(?<=[\\\\p{L}&&[^\\\\p{Lu}]])(?=\\\\p{Lu})|(?<=\\\\p{Lu})(?=\\\\p{Lu}[\\\\p{L}&&[^\\\\p{Lu}]])"
}
}
}
}
}
GET my-index-000001/_analyze
{
"analyzer": "camel",
"text": "MooseX::FTPClass2_beta"
}
上述例子生成以下术语:
[ moose, x, ftp, class, 2, beta ]
上述正则表达式更容易理解,可以表示为:
([^\\p{L}\\d]+) # swallow non letters and numbers,
| (?<=\\D)(?=\\d) # or non-number followed by number,
| (?<=\\d)(?=\\D) # or number followed by non-number,
| (?<=[ \\p{L} && [^\\p{Lu}]]) # or lower case
(?=\\p{Lu}) # followed by upper case,
| (?<=\\p{Lu}) # or upper case
(?=\\p{Lu} # followed by upper case
[\\p{L}&&[^\\p{Lu}]] # then lower case
)
定义
模式匹配分词器有如下构成:
分词器
- 模式分词器
标记过滤器
- 小写标记过滤器
- 停用词标记过滤器(默认情况下禁用)
如果您需要超出配置参数的自定义模式分析器,那么您需要将其重新创建为自定义分析器并进行修改,通常是通过添加标记过滤器。这将重新创建内置的模式分析器,您可以将其用作进一步定制的起点:
PUT /pattern_example
{
"settings": {
"analysis": {
"tokenizer": {
"split_on_non_word": {
"type": "pattern",
"pattern": "\\\\W+"
}
},
"analyzer": {
"rebuilt_pattern": {
"tokenizer": "split_on_non_word",
"filter": [
"lowercase"
]
}
}
}
}
}
简单分析器(*Simple analyzer*)
简单分析器将文本在任何非字母字符处拆分为标记,如数字、空格、连字符和撇号,丢弃非字母字符,并将大写字母转换为小写。
输出示例
POST _analyze
{
"analyzer": "simple",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
简单分析器解析句子并生成以下标记:
[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
定义
简单分析器由一个分词器定义:
分词器
定制化
要定制简单分析器,复制它以创建自定义分析器的基础。然后,可以根据需要修改此自定义分析器,通常是通过添加标记过滤器。
PUT /my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_simple_analyzer": {
"tokenizer": "lowercase",
"filter": [
]
}
}
}
}
}
标准分析器(*Standard analyzer*)
标准分析器是默认分析器,如果没有指定分析器,则会使用它。它提供基于语法的分词(基于Unicode文本分割算法,如Unicode标准附录#29中所述),适用于大多数语言。
示例输出
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 ]
配置
标准分析器接受以下参数:
max_token_length | 最大标记长度。如果看到的标记超过此长度,则在max_token_length间隔处拆分。默认为255。 |
---|---|
stopwords | 预定义的停用词列表,如english,或包含停用词列表的数组。默认为none。 |
stopwords_path | 包含停用词的文件路径。 |
配置示例
在这个例子中,我们配置标准分析器,将max_token_length设置为5(仅用于演示目的),并使用预定义的英语停用词列表:
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"type": "standard",
"max_token_length": 5,
"stopwords": "_english_"
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_english_analyzer",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
上述例子生成以下术语:
[ 2, quick, brown, foxes, jumpe, d, over, lazy, dog's, bone ]
定义
标准分析器由以下组成:
分词器
- 标准分词器
标记过滤器
- 小写标记过滤器
- 停用词标记过滤器(默认情况下禁用)
如果您需要超出配置参数的自定义标准分析器,那么您需要将其重新创建为自定义分析器并进行修改,通常是通过添加标记过滤器。这将重新创建内置的标准分析器,并可用作进一步定制的起点:
PUT /standard_example
{
"settings": {
"analysis": {
"analyzer": {
"rebuilt_standard": {
"tokenizer": "standard",
"filter": [
"lowercase"
]
}
}
}
}
}
停用词分析器(*Stop analyzer*)
停用词分析器与简单分析器相同,但增加了对移除停用词的支持。默认使用 _english_
停用词。
示例输出
POST _analyze
{
"analyzer": "stop",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
上述句子将生成以下术语:
[ quick, brown, foxes, jumped, over, lazy, dog, s, bone ]
配置
停用词分析器接受以下参数:
stopwords | 预定义的停用词列表,如english,或包含停用词列表的数组。默认为english。 |
---|---|
stopwords_path | 包含停用词的文件路径。此路径相对于Elasticsearch配置目录。 |
示例配置
在这个例子中,我们配置停用词分析器使用指定的词列表作为停用词:
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_stop_analyzer": {
"type": "stop",
"stopwords": ["the", "over"]
}
}
}
}
}
POST my-index-000001/_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 ]
定义
停用词分析器有如下组成:
分词器
标记过滤器
如果您需要在配置参数之外定制停用词分析器,那么您需要将其重新创建为自定义分析器并进行修改,通常是通过添加标记过滤器。这将重新创建内置的停用词分析器,您可以将其用作进一步定制的起点:
PUT /stop_example
{
"settings": {
"analysis": {
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
},
"analyzer": {
"rebuilt_stop": {
"tokenizer": "lowercase",
"filter": [
"english_stop"
]
}
}
}
}
}
空格分析器(*Whitespace analyzer*)
空格分析器将文本在遇到空格字符时拆分为术语。
输出示例
POST _analyze
{
"analyzer": "whitespace",
"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. ]
配置
不可配置
定义
分词器
如果您需要在配置参数之外定制空格分析器,那么您需要将其重新创建为自定义分析器并进行修改,通常是通过添加标记过滤器。这将重新创建内置的空格分析器,您可以将其用作进一步定制的起点:
评论区