Elasticsearch 分析

2025年3月17日 | 阅读 8 分钟

分析是一个将文本转换为词元或术语的过程,例如,转换任何电子邮件的正文。这些词元被添加到倒排索引中以供后续搜索。因此,在搜索操作处理查询时,分析模块会分析索引中的可用数据。此分析模块包括分析器、分词器、字符过滤器和词元过滤器。

例如 -

句子:“一只敏捷的白猫跳过了棕色的狗。”

词元:[quick, white, cat, jump, brown, dog]

分析由分析器执行。它可以是内置分析器,也可以是自定义分析器。自定义分析器是根据索引定义的。如果未定义分析器,则默认情况下,内置分析器、过滤器、词元和分词器会注册到分析模块。分析是通过以下方式完成的:

  • 分析器
  • 分词器
  • 词元过滤器
  • 字符过滤器

我们将详细讨论其中的每一个。在此之前,我们从一个简单的例子开始。

示例 -

让我们看一个简单的例子,我们将使用标准分析器来分析文本并将其转换为词元。这是在未指定任何内容时使用的默认分析器。它将分析句子并根据语法将它们分解为词元(单词)。

复制代码

响应

配置标准分析器

标准分析器可以根据我们的需求进行配置。我们还可以配置其他分析器以满足我们的自定义需求。通过一个例子,可以更好地理解它。

  • 首先,创建一个具有分析器的索引,并将max_token_length设置为配置标准分析器。
  • 在 max_token_length 变量中提供值。我们将其设置为 7。
  • 我们还将把标准分析器的名称修改为my_english_analyzer,它将在分析文本时使用。
  • 请看下面给出的示例 -

复制代码

响应

配置标准分析器后分析文本

创建具有修改后分析器的索引后,现在我们将使用分析器处理文本。在下面的示例中,您必须在查询字符串中提供索引名称(analysis_example),并在请求正文中提供分析器以及文本字符串。不要忘记提供 _analyze API。

复制代码

您注意到,在文本字符串中,elasticsearch 和 tutorial 分别有 13 和 8 个字符。因此,它们也将根据之前查询中指定的 maximum token length 进一步分解。

响应

不同类型的分析器

有几种分析器,每种都有不同的功能。它们有助于根据需要实现不同的目标。以下是内置分析器及其描述列表:

序号分析器描述
1标准分析器(standard)在标准分析器中,可以修改 max_token_length 和 stopwords 设置。其中,默认的 max_token _length 为 255,stopwords 列表为空。如果未指定任何内容,它就是默认分析器。
2简单分析器(simple)它由小写分词器组成。
空格分析器(whitespace)它由空格分词器组成。
停用词分析器(stop)在此分析器中,可以配置 stopwords 和 stopwords_path。默认情况下,stopword_path 包含停用词文本文件的路径,并且 stopwords 默认初始化为英语停用词。
4关键字分析器(keyword)关键字分析器将整个流分析为一个单一的词元。例如,它可用于邮政编码。
5模式分析器(pattern)顾名思义,此分析器处理正则表达式。在此分析器中,我们可以设置各种设置,如模式、小写、标志和停用词。
6语言分析器语言分析器允许用户处理印地语、英语、荷兰语、阿拉伯语等各种语言。
7Snowball 分析器(snowball)Snowball 分析器使用标准分词器以及标准过滤器、snowball 过滤器、小写过滤器和停用词过滤器。
8自定义分析器(custom)顾名思义,此分析器有助于创建自定义分析器,以及分词器和可选的词元过滤器和字符过滤器。在此分析器中,可以配置各种设置,如:filter、char_filter、tokenizer 和 position_increment_gap。

关键字分词器示例

正如我们所讨论的,关键字分析器将整个流视为一个单一的词元。看看下面关键字分析器的例子。为此,我们不需要任何索引。我们只需要在 analyzer 字段中指定 analyzer 类型,并在 text 字段中指定 text 字符串。不要忘记在 API 列中传递 _analyze API

复制代码

响应

截图

Elasticsearch Analysis

分词器

在 elasticsearch 中,分词器用于从文本生成词元。分词器通过放置空格或其他标点符号来帮助将文本分解为词元。Elasticsearch 提供内置分词器,可以在自定义分析器中使用。下表是分词器及其描述:

序号分词器描述
1标准分词器(standard)此标准分词器基于基于语法的分词器构建。对于此分词器,可以配置 max_token_length。
2边缘 N グラム 分词器(edgeNGram)此分词器允许我们设置不同的设置,如 min_gram、max_gram 和 token_chars。
3关键字分词器(keyword)Keyword 分词器将整个输入作为输出生成。我们可以为该分词器设置 buffer_size。
4字母分词器(letter)Letter 分词器捕获整个单词,直到遇到非字母字符。它会避免显示非字母数据。
5小写分词器(lowercase)Lowercase 分词器与 letter 分词器非常相似。唯一的区别是它在创建词元后将其转换为小写。
6N グラム 分词器对于此分词器,我们可以设置一些设置,如 min_gram、max_gram 和 token_chars 设置。min_gram 的默认值为 1,max_gram 的默认值为 2。
7空格分词器(whitespace)根据查询字符串中的空格,它会分割文本。
8模式分词器(pattern)与模式分析器类似,它也使用正则表达式作为词元分隔符。我们可以为该分词器设置 pattern、group 和 flag 设置。
9经典分词器由于它是一个经典分词器,它只是根据语法将查询字符串分解为词元。我们可以为该分词器设置 max_token_length。它作用于基于语法的词元。
10UAX 电子邮件 URL 分词器(uax_url_email)此分词器与标准分词器的工作方式相同,但它们之间也有区别。UAX Email URL 分词器将电子邮件和 URL 视为单个词元。
11路径分层分词器(path_hieharchy)此分词器有助于生成输入目录路径中所有可能的路径。此分词器有一些可用的设置,它们是:replacement_buffer_size(默认为 1024)、reverse(默认为 false)、delimiter(默认为 /)和 skip(默认为 0)。
12泰语分词器泰语分词器基本上是为泰语设计的,它使用内置的泰语分割算法。

现在,让我们看一个分词器如何工作的例子。在下面的例子中,分词器将在遇到非字母字符时将文本分解为词元。它还将所有词元转换为小写。请看下面的例子:

小写分词器示例

复制代码

响应

请注意,在上面的响应中,所有大写字母都转换为小写,并且 elasticsearch 没有打印数字(非字母)值,即 2。但它为其保留了空间,例如在非字母字符之前的一个空间,在非字母字符结束时的一个空间,以及它本身的一个空间。

截图

Elasticsearch Analysis

经典分词器示例

在此示例中,我们将在 API 部分传递 _analyze API,并在 “tokenizer” 变量中指定分词器名称。最后,我们需要提供一个文本字符串来分解文本。

复制代码

响应

在下面的响应中,您可以看到文本流被分为词元,类型为字母数字,这意味着字母和数字值都将被显示。与小写分词器一样,这里的词元不会转换为小写,并且数字值也会在响应中显示。

截图

Elasticsearch Analysis

同样,通过在 tokenizer 字段中传递它们的名称,并在 text 字符串中传递文本,我们可以获得另一个分词器的结果。

词元过滤器

  • Elasticsearch 提供内置的词元过滤器,它们从分词器接收输入。
  • 接收输入后,这些过滤器可以添加、修改和删除输入中的文本。
  • 我们已经在上一节中解释了大多数词元过滤器。

字符过滤器

  • 字符过滤器在分词器之前处理文本。
  • 它会查找指定的模式、特殊字符或 HTML 标签,然后删除或将其更改为适当的单词,例如将 & 更改为 and,删除 HTML 标记。