分析 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"]
}
"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
} ]
} ]
}
}
"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"
}