目 录CONTENT

文章目录

【ElasticSearch】内建分析器参考

EulerBlind
2025-07-01 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

概述

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. ]

点击并拖拽以移动

配置

不可配置

定义

分词器

如果您需要在配置参数之外定制空格分析器,那么您需要将其重新创建为自定义分析器并进行修改,通常是通过添加标记过滤器。这将重新创建内置的空格分析器,您可以将其用作进一步定制的起点:

0

评论区