跳到主要内容

分析 API

对文本字符串执行分析并返回结果 token(标记)。

GET /_analyze
{
"analyzer" : "standard",
"text" : "Quick Brown Foxes!"
}

请求

GET /_analyze

POST /_analyze

GET /<index>/_analyze

POST /<index>/_analyze

前置条件

  • 如果 Elasticsearch 安全特性启用,你对指定索引必须有 manage 索引权限

路径参数

  • <index>

(可选,字符串)用于产生分析器的索引。

如果指定,<analyzer><field> 将覆盖此值。

如果没有指定分析器或字段,则分析 API 将为索引使用默认分析器。

如果没有指定索引或索引没有默认分析器,则分析 API 使用标准分析器

查询参数

-analyzer

(可选,字符串)将用于提供的 text 的分析器的名称。这可以是一个内置分析器,也可以是在索引中配置的分析器。

如果未指定此参数,则分析 API 将使用该字段映射中定义的分析器。

如果没有指定字段,分析 API 将对索引使用默认分析器。

如果没有指定索引,或者索引没有默认分析器,则分析 API 使用标准分析器

  • attributes

(可选,字符串数组)用于过滤 explain 参数输出的 token(标记)属性数组。

  • char_filter

(可选,字符串数组)在 tokenizer(标记器)之前,预处理字符的字符过滤器数组。参阅字符过滤器参考获知一系列的字符过滤器。

  • explain

(可选,布尔值)如果为 true,响应包含标记的属性和更多详情。默认为 false。【更多详情信息的格式在 Lucene 中被标记为实验性的,将来可能会改变。

  • field

(可选,字符串)用于导出分析器的字段。要使用该参数,必须指定一个索引。

如果指定,参数 analyzer 将覆盖此值。

如果没有指定字段,分析 API 将对索引使用默认分析器。

如果没有指定索引或索引没有默认分析器,则分析 API 使用标准分析器

  • filter

(可选,字符串数组)用于在标记器之后应用的标记过滤器数组。参阅标记过滤器参考获知一系列的标记过滤器。

  • normalizer

(可选,字符串)用于将文本转换为单个标记的规范化器。参阅规范化器获知一系列的规范化器。

  • text

(必需,字符串或字符串数组)待分析的文本。如果是字符串数组,会作为多值字段分析。

  • tokenizer

(可选,字符串)标记器,用于将文本转换为标记。参阅标记器获知一系列的标记器。

示例

未指定索引

你可以对文本串应用任何内置分析器,不用指定索引的。

GET /_analyze
{
"analyzer" : "standard",
"text" : "this is a test"
}

文本串数组

如果参数 text 以字符串数组形式提供,它会作为多值字段分析。

GET /_analyze
{
"analyzer" : "standard",
"text" : ["this is a test", "the second text"]
}

自定义分析器

你可以使用分析 API 来测试从标记器、标记过滤器和字符过滤器构建的自定义 transient(瞬态)分析器。标记过滤器使用 filter 参数:

GET /_analyze
{
"tokenizer" : "keyword",
"filter" : ["lowercase"],
"text" : "this is a test"
}
GET /_analyze
{
"tokenizer" : "keyword",
"filter" : ["lowercase"],
"char_filter" : ["html_strip"],
"text" : "this is a <b>test</b>"
}

自定义标记器、标记过滤器和字符过滤器可以在请求体中指定,如下所示:

GET /_analyze
{
"tokenizer" : "whitespace",
"filter" : ["lowercase", {"type": "stop", "stopwords": ["a", "is", "this"]}],
"text" : "this is a test"
}

指定索引

你也可以针对特定的索引运行分析 API:

GET /analyze_sample/_analyze
{
"text" : "this is a test"
}

上面的代码将使用与索引 analyze_sample 相关联的默认索引分析器,对 “this is a test” 文本进行分析。也可以提供一个 analyzer 来使用与索引所关联不同的分析器:

GET /analyze_sample/_analyze
{
"analyzer" : "whitespace",
"text" : "this is a test"
}

从字段映射导出分析器

分析器可以基于字段映射来派生,例如:

GET /analyze_sample/_analyze
{
"field" : "obj1.field1",
"text" : "this is a test"
}

这将导致基于在 obj1.field1 映射中配置的分析器进行分析(如果没有,则为默认的索引分析器)。

规范化器

可以为与索引 analyze_sample 关联的规范化器的关键字字段提供一个 normalizer

GET /analyze_sample/_analyze
{
"normalizer" : "my_normalizer",
"text" : "BaR"
}

或者通过在标记筛选器和字符过滤器中构建自定义瞬态规范化器。

GET /_analyze
{
"filter" : ["lowercase"],
"text" : "BaR"
}

解释分析

如果你想获得更高级的细节,请将 explain设置为 true (默认为 false)。它会输出每个标记的所有标记属性。你可以通过设置选项 attributes 来过滤你想输出的标记属性。

提示

更多详情信息的格式在 Lucene 中被标记为实验性的,将来可能会改变。

GET /_analyze
{
"tokenizer" : "standard",
"filter" : ["snowball"],
"text" : "detailed output",
"explain" : true,
"attributes" : ["keyword"]
}
  1. "attributes" : ["keyword"] 设置 “keyword” 为唯一输出的 “keyword” 属性

请求返回以下结果:

{
"detail" : {
"custom_analyzer" : true,
"charfilters" : [ ],
"tokenizer" : {
"name" : "standard",
"tokens" : [ {
"token" : "detailed",
"start_offset" : 0,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 0
}, {
"token" : "output",
"start_offset" : 9,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 1
} ]
},
"tokenfilters" : [ {
"name" : "snowball",
"tokens" : [ {
"token" : "detail",
"start_offset" : 0,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 0,
"keyword" : false
}, {
"token" : "output",
"start_offset" : 9,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 1,
"keyword" : false
} ]
} ]
}
}
  1. "keyword" : false 由于在请求中指定了 "attributes",只输出 "keyword" 属性。

设置标记限制

生成过多的标记可能会导致节点耗尽内存。下面的设置允许限制可以产生的标记的数量:

  • index.analyze.max_token_count

通过 _analyze API 可以产生的标记的最大数量。默认值为 10,000。如果生成的标记超出这个限制,会抛出错误。没有指定索引的 _analyze 端点将始终使用 10,000 作为限制。这个设置允许你控制一个特定索引的限制:

PUT /analyze_sample
{
"settings" : {
"index.analyze.max_token_count" : 20000
}
}
GET /analyze_sample/_analyze
{
"text" : "this is a test"
}

原文链接