Elasticsearch 分析

当在搜索操作期间处理查询时,分析模块分析任何索引中的内容。 该模块由分析器、tokenizertokenfilterscharfilters 组成。 如果没有定义分析器,那么默认情况下内置的分析器、令牌、过滤器和分词器会在分析模块中注册。

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

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

配置标准分析器

我们可以为标准分析仪配置各种参数来满足我们的定制要求。

在以下示例中,我们将标准分析器配置为 max_token_length 为 5。

为此,我们首先使用具有 max_length_token 参数的分析器创建索引。

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

接下来,我们应用带有文本的分析器,如下所示。 请注意令牌是如何显示的,因为它在开头有两个空格,在结尾有两个空格。 对于“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
      }
   ]
}

下表给出了各种分析器的列表及其说明

序号 分析器 描述
1 Standard analyzer (standard) 可以为此分析器设置停用词和 max_token_length 设置。 默认情况下,停用词列表为空,max_token_length 为 255。
2 Simple analyzer (simple) 该分析器由小写分词器组成。
3 Whitespace analyzer (whitespace) 该分析器由空白标记器组成。
4 Stop analyzer (stop) 可以配置停用词和停用词路径。 默认情况下,停用词初始化为英语停用词,而 stopwords_path 包含带有停用词的文本文件的路径。

Tokenizers

Tokenizers 用于从 Elasticsearch 中的文本生成标记。 通过考虑空格或其他标点符号,可以将文本分解为标记。 Elasticsearch 有很多内置的分词器,可以在自定义分析器中使用。

下面显示了一个分词器的示例,它在遇到不是字母的字符时将文本分解为术语,但它也会将所有术语小写

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

下表显示了分词器列表及其描述

序号 分析器 描述
1 Standard tokenizer (standard) 这是建立在基于语法的分词器之上的,并且可以为此分词器配置 max_token_length
2 Edge NGram tokenizer (edgeNGram) 可以为此分词器设置 min_grammax_gramtoken_chars 等设置。
3 Keyword tokenizer (keyword) 这会将整个输入生成为输出,并且可以为此设置 buffer_size
4 Letter tokenizer (letter) 这会捕获整个单词,直到遇到非字母为止。

查看笔记

扫码一下
查看教程更方便