ES 分析

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

例如:

句子: "一个快速的白色猫跳过了棕色的狗。"

标记: [快速,白色,猫,跳跃,棕色,狗]

分析由分析器执行.它可以是内置分析器或自定义分析器。自定义分析器是根据索引定义的。如果未定义分析器,则默认情况下内置分析器、过滤器、标记和标记器将注册到分析模块。分析是在:

  • 分析器
  • 分词器
  • 令牌过滤器
  • 字符过滤器

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

例子:

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

POST http://localhost:9200/
_analyze
{
   "analyzer": "standard",
   "text": "It is best elasticsearch tutorial."
}

回复

{
       "tokens": [
       {
  "token": "it",
  "start_offset": 0,
  "end_offset": 2,
  "type": "<ALPHANUM>",
  "position": 0,
        },
       {
  "token": "is",
  "start_offset": 3,
  "end_offset": 5,
  "type": "<ALPHANUM>",
  "position": 1,
        },
       {
  "token": "best",
  "start_offset": 6,
  "end_offset": 10,
  "type": "<ALPHANUM>",
  "position": 2,
        },
       {
  "token": "elasticsearch",
  "start_offset": 11,
  "end_offset": 24,
  "type": "<ALPHANUM>",
  "position": 3,
        },
       {
  "token": "tutorial",
  "start_offset": 25,
  "end_offset": 33,
  "type": "<ALPHANUM>",
  "position": 4,
        }
    ]
}

配置标准分析仪

标准分析仪可以根据我们的要求进行配置。我们还可以配置其他分析仪来满足我们的自定义要求。借助示例,可以更好地理解它。

  • 首先,使用具有max_token_length的分析器创建索引以配置标准分析器。
  • 提供 max_token_length 变量中的值。我们将其设置为 7、
  • 我们还将标准分析器的名称修改为my_english_analyzer,用于分析文本。
  • 看看下面给出的例子-
PUT http://localhost:9200/analysis_example
{
   "settings": {
      "analysis": {
         "analyzer": {
            "my_english_analyzer": {
               "type": "standard",
               "max_token_length": 7,
               "stopwords": "_english_"
            }
         }
      }
   }
}

响应:

{
  "acknowledged: true,
  "shards_acknowledged": false,
  "index": "analysis_example"
}

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

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

POST http://localhost:9200/analysis_example
_analyze
{
   "analyzer": "my_english_analyzer",
   "text": "It is best elasticsearch tutorial."
}

您注意到 elasticsearch 和 tutorial 在文本字符串中分别有 13 个和 8 个字符。从而,它们也会根据前面查询中指定的最大令牌长度进一步分解。

响应:

{
       "tokens": [
       {
  "token": "best",
  "start_offset": 6,
  "end_offset": 10,
  "type": "<ALPHANUM>",
  "position": 2,
        },
       {
  "token": "elastic",
  "start_offset": 11,
  "end_offset": 18,
  "type": "<ALPHANUM>",
  "position": 3,
        },
       {
  "token": "elastic",
  "start_offset": 19,
  "end_offset": 24,
  "type": "<ALPHANUM>",
  "position": 4,
        },
       {
  "token": "tutoria",
  "start_offset": 25,
  "end_offset": 31,
  "type": "<ALPHANUM>",
  "position": 5,
        }
       {
  "token": "l",
  "start_offset": 32,
  "end_offset": 33,
  "type": "<ALPHANUM>",
  "position": 6,
        }
    ]
}

不同类型的分析器

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

分析器 说明
Standard Analyzer 在标准分析器中,可以修改 max_token_length 和 stopwords 设置。在此,默认 max_token _length 为 255,停用词列表为空。如果没有指定,则为默认分析器。
Simple Analyzer(简单) 它由小写标记器组成。
Whitespace Analyzer 它由空格标记器组成。
Stop Analyzer 在这个分析器中,可以配置停用词和停用词路径。默认情况下,stopword_path 包含带有停用词的文本文件的路径,并且停用词默认初始化为英文停用词。
Keyword Analyzer 关键字分析器将整个流标记为单个标记。例如,它可以用于邮政编码。
Pattern Analyzer 顾名思义,这个分析器处理正则表达式。在这个分析器中,我们可以设置各种设置,如模式、小写、标志和停用词。
Language Analyzer 语言分析器允许用户处理各种语言,如印地语、英语、荷兰语、阿拉伯语等。
Snowball Analyzer Snowball 分析器使用标准分词器以及标准过滤器、雪球过滤器、小写过滤器和停止过滤器。
Custom Analyzer 顾名思义,该分析器有助于创建自定义分析器以及标记器和可选的标记过滤器和字符过滤器。在此分析器中,可以配置各种设置,例如-filter、char_filter、tokenizer 和 position_increment_gap。

关键字标记器示例

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

POST http://localhost:9200/
_analyze
{
   "analyzer": "Keyword",
   "text": "It is best elasticsearch tutorial."
}

回应

{
       "tokens": [
       {
  "token": "It is best elasticsearch tutorial.",
  "start_offset": 0,
  "end_offset": 34,
  "type": "word",
  "position": 0,
        }
    ]
}

屏幕截图

Elasticsearch Analysis

分词器

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

分词器 说明
Standard tokenizer 这个标准分词器建立在基于语法的分词器之上。对于这个分词器,可以配置 max_token_length。
Edge NGram tokenizer) 这个标记器允许我们设置不同的设置,例如 min_gram、max_gram 和 token_chars。
Keyword tokenizer 关键字标记器生成整个输入作为输出。我们可以为这个分词器设置 buffer_size。
Letter tokenizer (letter) letter tokenizer 捕获整个单词,直到遇到一个不是字母的字符。它避免显示非字母数据。
Lowercase tokenizer 小写分词器与字母分词器非常相似。唯一的区别是它在创建令牌后将它们转换为小写。
NGram tokenizer 对于这个分词器,我们可以设置一些设置,比如 min_gram、max_gram 和 token_chars 设置。 min_gram 的默认值为 1,max_gram 为 2、
Whitespace tokenizer 根据查询字符串中的空格划分文本。
Pattern tokenizer 与模式分析器类似,它也使用正则表达式作为标记分隔符。我们可以为此标记器设置模式、组和标志设置。
Classic tokenizer 由于它是一个经典的标记器,它只是根据语法将查询字符串分解为标记。我们可以为这个分词器设置 max_token_length。它适用于基于语法的标记。
UAX Email URL Tokenizer 这个分词器与标准分词器的工作方式相同,但它们之间也有区别。 UAX邮箱URL 标记器将电子邮件和 URL 视为单个标记。
Path hierarchy tokenizer 此标记器有助于生成输入目录路径中存在的所有可能路径。这个标记器有一些可用的设置,它们是-replacement_buffer_size(默认为1024)、reverse(默认为false)、分隔符(默认为/)和skip(默认为0)。
Thai tokenizer 泰语分词器基本上是为泰语设计的,它使用了内置的泰语分割算法。

现在,让我们举一个分词器的例子,看看它是如何在 elasticsearch 中工作的。在以下示例中,每当找到非字母字符时,标记器会将文本分解为标记。它还将所有标记转换为小写。请参阅下面的示例:

Lowercase Tokenizer Example

POST http://localhost:9200/
_analyze
{
   "tokenizer": "lowercase",
   "text": "It Was My BIRTHDAY 2 Days Ago"
}

回应

{
       "tokens": [
       {
  "token": "it",
  "start_offset": 0,
  "end_offset": 2,
  "type": "word",
  "position": 0,
        },
       {
  "token": "was",
  "start_offset": 3,
  "end_offset": 6,
  "type": "word",
  "position": 1,
        },
       {
  "token": "my",
  "start_offset": 7,
  "end_offset": 9,
  "type": "word",
  "position": 2,
        },
       {
  "token": "birthday",
  "start_offset": 10,
  "end_offset": 18,
  "type": "word",
  "position": 3,
        },
       {
  "token": "days",
  "start_offset": 21,
  "end_offset": 25,
  "type": "word",
  "position": 4,
        },
       {
  "token": "ago",
  "start_offset": 26,
  "end_offset": 29,
  "type": "word",
  "position": 5,
        }
    ]
}

注意: 注意-在上面的响应中,所有大写字母转换成小写字母和elasticsearch并没有打印数字(非字母)值,即2、但它保持它的空间就像一个用于非字母之前的空间,一个用于该非字母字符的结尾,一个用于其本身。

截图

Elasticsearch Analysis

Classic Tokenizer 示例

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

POST http://localhost:9200/
_analyze
{
   "tokenizer": "classic",
   "text": "It Was My BIRTHDAY 2 Days Ago"
}

Response

在下面的响应中,可以看到文本流被划分为tokens,类型为字母数字,这意味着将显示字母和数字值。和小写分词器一样,这里的token没有转成小写,响应中也显示数值。

{
       "tokens": [
       {
  "token": "It",
  "start_offset": 0,
  "end_offset": 2,
  "type": "<ALPHANUM>",
  "position": 0,
        },
       {
  "token": "Was",
  "start_offset": 3,
  "end_offset": 6,
  "type": "<ALPHANUM>",
  "position": 1,
        },
       {
  "token": "My",
  "start_offset": 7,
  "end_offset": 9,
  "type": "<ALPHANUM>",
  "position": 2,
        },
       {
  "token": "BIRTHDAY",
  "start_offset": 10,
  "end_offset": 18,
  "type": "<ALPHANUM>",
  "position": 3,
        },
       {
  "token": "2",
  "start_offset": 19,
  "end_offset": 20,
  "type": "<ALPHANUM>",
  "position": 4,
        },
       {
  "token": "Days",
  "start_offset": 21,
  "end_offset": 25,
  "type": "<ALPHANUM>",
  "position": 4,
        },
       {
  "token": "Ago",
  "start_offset": 26,
  "end_offset": 29,
  "type": "<ALPHANUM>",
  "position": 5,
        }
    ]
}

截图

Elasticsearch Analysis

同样,我们可以得到只需在标记器字段中传递它们的名称并在文本字符串中传递文本即可为另一个标记器生成结果。

标记过滤器

  • Elasticsearch 提供内置令牌过滤器,可接收来自令牌生成器的输入。
  • 收到输入后,这些过滤器可以添加、修改和删除该输入中的文本。
  • 我们已经在上一节中解释了大部分令牌过滤器。

字符过滤器

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

下一章:ES 映射

Elasticsearch 为其用户提供了一种映射机制。它允许用户对文档及其字段执行映射。映射是索引或存储数据库中的文档和字段的过程。它定义了文档及其字段的存储和索引方式。我们可以为不同类型的字段定义数据类型,例如-字符串、数字 ...