Elasticsearch 分析怎么玩?分词器 analyzer 如何配置使用?

文章导读
Previous Quiz Next 在搜索操作期间处理查询时,analysis module 会分析任何索引中的内容。该模块由 analyzer、tokenizer、token filters 和 char filters 组成。如果未定义 analyzer,则默认情况下
📋 目录
  1. 配置 Standard analyzer
  2. Tokenizers
A A

Elasticsearch - Analysis



Previous
Quiz
Next

在搜索操作期间处理查询时,analysis module 会分析任何索引中的内容。该模块由 analyzer、tokenizer、token filters 和 char filters 组成。如果未定义 analyzer,则默认情况下内置的 analyzers、token filters 和 tokenizers 会注册到 analysis module。

在以下示例中,我们使用 standard analyzer,它在未指定其他 analyzer 时使用。它会根据语法分析句子,并生成句子中使用的单词。

POST _analyze
{
   "analyzer": "standard",
   "text": "Today's weather is beautiful"
}

运行上述代码后,我们会得到如下响应 −

{
   "tokens" : [
      {
         "token" : "today's",
         "start_offset" : 0,
         "end_offset" : 7,
         "type" : "",
         "position" : 0
      },
      {
         "token" : "weather",
         "start_offset" : 8,
         "end_offset" : 15,
         "type" : "",
         "position" : 1
      },
      {
         "token" : "is",
         "start_offset" : 16,
         "end_offset" : 18,
         "type" : "",
         "position" : 2
      },
      {
         "token" : "beautiful",
         "start_offset" : 19,
         "end_offset" : 28,
         "type" : "",
         "position" : 3
      }
   ]
}

配置 Standard analyzer

我们可以通过各种参数配置 standard analyzer,以满足自定义需求。

在下面的示例中,我们将 standard analyzer 的 max_token_length 配置为 5。

为此,我们首先创建一个带有 max_token_length 参数的 analyzer 的 index。

PUT index_4_analysis
{
   "settings": {
      "analysis": {
         "analyzer": {
            "my_english_analyzer": {
               "type": "standard",
               "max_token_length": 5,
               "stopwords": "_english_"
            }
         }
      }
   }
}

接下来,我们使用如下所示的文本应用该 analyzer。请注意 token "is" 没有出现,因为它开头有两个空格,结尾有两个空格。对于单词 "is",它开头有一个空格,结尾有一个空格。综合考虑,所有这些使得它成为 4 个带空格的字母,这无法构成一个单词。要使其成为一个可计数的单词,至少开头或结尾应该有一个非空格字符。

POST index_4_analysis/_analyze
{
   "analyzer": "my_english_analyzer",
   "text": "Today's weather is beautiful"
}

运行上述代码后,我们会得到如下响应 −

{
   "tokens" : [
      {
         "token" : "today",
         "start_offset" : 0,
         "end_offset" : 5,
         "type" : "",
         "position" : 0
      },
      {
         "token" : "s",
         "start_offset" : 6,
         "end_offset" : 7,
         "type" : "",
         "position" : 1
      },
      {
         "token" : "weath",
         "start_offset" : 8,
         "end_offset" : 13,
         "type" : "",
         "position" : 2
      },
      {
         "token" : "er",
         "start_offset" : 13,
         "end_offset" : 15,
         "type" : "",
         "position" : 3
      },
      {
         "token" : "beaut",
         "start_offset" : 19,
         "end_offset" : 24,
         "type" : "",
         "position" : 5
      },
      {
         "token" : "iful",
         "start_offset" : 24,
         "end_offset" : 28,
         "type" : "",
         "position" : 6
      }
   ]
}

各种 analyzer 及其描述如下表所示 −

S.No Analyzer & Description
1

Standard analyzer (standard)

可以为该 analyzer 设置 stopwords 和 max_token_length。默认情况下,stopwords 列表为空,max_token_length 为 255。

2

Simple analyzer (simple)

该 analyzer 由 lowercase tokenizer 组成。

3

Whitespace analyzer (whitespace)

该 analyzer 由 whitespace tokenizer 组成。

4

Stop analyzer (stop)

可以配置 stopwords 和 stopwords_path。默认情况下,stopwords 初始化为英语停用词,stopwords_path 包含包含停用词的文本文件路径。

Tokenizers

在 Elasticsearch 中,Tokenizers 用于从文本中生成 tokens。文本可以通过考虑空白字符或其他标点符号来分解为 tokens。Elasticsearch 提供了大量的内置 tokenizer,这些 tokenizer 可以用于自定义 analyzer。

下面是一个示例 tokenizer,它在遇到非字母字符时将文本分解为 terms,同时将所有 terms 转换为小写:

POST _analyze
{
   "tokenizer": "lowercase",
   "text": "It Was a Beautiful Weather 5 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" : "a",
         "start_offset" : 7,
         "end_offset" : 8,
         "type" : "word",
         "position" : 2
      },
      {
         "token" : "beautiful",
         "start_offset" : 9,
         "end_offset" : 18,
         "type" : "word",
         "position" : 3
      },
      {
         "token" : "weather",
         "start_offset" : 19,
         "end_offset" : 26,
         "type" : "word",
         "position" : 4
      },
      {
         "token" : "days",
         "start_offset" : 29,
         "end_offset" : 33,
         "type" : "word",
         "position" : 5
      },
      {
         "token" : "ago",
         "start_offset" : 34,
         "end_offset" : 37,
         "type" : "word",
         "position" : 6
      }
   ]
}

下表列出了各种 Tokenizer 及其描述:

S.No Tokenizer & Description
1

Standard tokenizer (standard)

这是基于语法分析的 tokenizer,可以为此 tokenizer 配置 max_token_length

2

Edge NGram tokenizer (edgeNGram)

可以为此 tokenizer 设置 min_grammax_gramtoken_chars 等参数。

3

Keyword tokenizer (keyword)

这会将整个输入作为输出生成,可以为此设置 buffer_size

4

Letter tokenizer (letter)

这会捕获直到遇到非字母字符的整个单词。