【Elasticsearch】keyword分析器

时间:2025-02-17 10:26:15

Elasticsearch 中的`keyword`分析器是一种非常特殊的分析器,它的行为与其他常见的分析器(如`standard`、`whitespace`等)截然不同。`keyword`分析器的核心功能是将整个输入字符串作为一个单一的标记(token)返回,而不会对其进行任何拆分或进一步处理。以下是对`keyword`分析器的详细描述,包括其工作原理、适用场景、配置方法以及与其他分析器的对比。

1.工作原理

`keyword`分析器是一个“无操作”(noop)分析器,它的工作原理非常简单:

• 输入:接收一个完整的字符串作为输入。

• 处理:不对输入字符串进行任何拆分或修改,直接将整个字符串作为一个单一的标记返回。

• 输出:返回一个包含整个输入字符串的标记列表,列表中只有一个标记。

例如,假设输入字符串为:

```

"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."

```

使用`keyword`分析器后,输出结果为:

```

[ "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." ]

```

2.适用场景

由于`keyword`分析器不会对输入字符串进行拆分,因此它适用于以下几种场景:

2.1 精确匹配

当你需要对某个字段进行精确匹配时,`keyword`分析器非常有用。例如:

• 用户输入的完整短语:如果用户输入一个完整的短语(如搜索框中的内容),使用`keyword`分析器可以确保只有完全匹配该短语的文档才会被检索到。

• 代码片段:对于存储代码片段的字段,使用`keyword`分析器可以确保代码片段作为一个整体被索引和搜索。

• 文件名和路径:文件名和路径通常需要精确匹配,使用`keyword`分析器可以避免因分词而导致的不精确结果。

2.2 保持字符串完整性

某些字段需要保持原始输入的完整性,而不是被拆分为多个标记。例如:

• 标签(Tags):标签字段通常需要精确匹配,而不是被拆分为多个单词。

• 状态码(Status Codes):状态码字段通常是一个固定的字符串,需要保持原样。

• 用户输入的完整命令:用户输入的完整命令(如 SQL 查询)需要作为一个整体被索引和搜索。

2.3 自定义分析器的起点

虽然`keyword`分析器本身不可配置,但你可以基于它创建自定义分析器。通过添加标记过滤器(token filters),你可以进一步定制分析器的行为。例如:

• 大小写转换:在保持字符串完整性的同时,将所有字符转换为小写或大写。

• 去除特殊字符:在保持字符串完整性的同时,去除某些特殊字符。

3.配置方法

`keyword`分析器本身是不可配置的,但你可以通过创建自定义分析器来实现类似的功能,并添加额外的标记过滤器。

3.1 创建自定义分析器

以下是一个基于`keyword`分析器创建自定义分析器的示例:

```json

PUT /keyword_example

{

  "settings": {

    "analysis": {

      "analyzer": {

        "rebuilt_keyword": {

          "tokenizer": "keyword",

          "filter": []

        }

      }

    }

  }

}

```

 

 

在这个例子中,`rebuilt_keyword`是一个自定义分析器,它使用了`keyword`分词器(tokenizer),并且没有添加任何标记过滤器。你可以根据需要添加标记过滤器来进一步定制分析器的行为。

4.示例代码

以下是一些使用`keyword`分析器的示例代码,

POST _analyze
{
  "analyzer": "keyword",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
 

5.对比其他分析器

为了更好地理解`keyword`分析器的作用,我们可以将其与其他常见的分析器进行对比:

5.1`standard`分析器

`standard`分析器会将输入字符串拆分为多个单词,并去除标点符号。例如:

• 输入:`"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."`

• 输出:`["the", "2", "quick", "brown", "foxes", "jumped", "over", "the", "lazy", "dog's", "bone"]`

5.2`whitespace`分析器

`whitespace`分析器会将输入字符串按空格拆分为多个单词,但不会去除标点符号。例如:

• 输入:`"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."`

• 输出:`["The", "2", "QUICK", "Brown-Foxes", "jumped", "over", "the", "lazy", "dog's", "bone."]`

5.3`keyword`分析器

`keyword`分析器不会对输入字符串进行任何拆分,而是将整个字符串作为一个单一的标记返回。例如:

• 输入:`"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."`

• 输出:`["The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."]`

6.总结

`keyword`分析器在 Elasticsearch 中的主要作用是保持字符串的完整性,确保输入的字符串作为一个单一的标记被索引和搜索。它适用于需要精确匹配的场景,以及那些不需要分词的字段。如果你需要对字段进行更复杂的处理,可以基于`keyword`分析器创建自定义分析器,并添加标记过滤器来进一步定制分析器的行为。

通过合理使用`keyword`分析器,你可以更好地满足不同字段的索引和搜索需求,提高数据处理的灵活性和准确性。