_analyze 是什么
_analyze 用来直接观察文本如何被切分:可以指定 analyzer 名称,也可以用 tokenizer 加 filter 组合出自定义链条,输出 token 列表与位置信息。它是排查「明明有数据却搜不到」的第一站——索引期与查询期用了不同分析器时词条对不上,查询就会静默无命中。加 explain: true 还能看到每一步的处理细节。
基本信息
| 接口 | GET /_analyze 或 GET /<index>/_analyze |
|---|---|
| 内置分析器 | standard / whitespace / keyword / simple / stop / english |
| 自定义方式 | tokenizer + filter(+ char_filter)组合 |
| 附加参数 | explain: true、attributes、normalizer |
| 指定字段 | 传 field 时使用该字段映射里配置的分析器 |
| 适用版本 | Elasticsearch 7.x / 8.x |
典型使用场景
- 验证中文分词器对业务文本的切分是否符合预期
- 确认 keyword 字段分词结果只有原始整串一个 token
- 对比索引期与查询期分析器是否一致
- 排查大小写、标点、连字符导致的词条差异
- 验证自定义停用词与同义词过滤器是否生效
- 自定义词典更新后确认新词已能被切出来
示例
示例
GET /_analyze
{ "analyzer": "standard", "text": "The QUICK brown-fox" } # 看大小写与标点处理
GET /my-index/_analyze
{ "field": "message", "text": "Hello Elastic" } # 用字段配置的分析器
GET /_analyze
{ "tokenizer": "standard", "filter": ["lowercase"], "text": "Hello ES", "explain": true }
GET /_analyze
{ "analyzer": "keyword", "text": "Not Split At All" } # keyword 只有一个 tokentoken 输出字段
| 字段 | 含义 | 读法 |
|---|---|---|
| token | 切分后的词条 | 查询能否命中取决于它 |
| start_offset | 起始字符偏移 | 定位原文位置 |
| end_offset | 结束字符偏移 | 与 start 一起圈定范围 |
| position | 词条位置序号 | match_phrase 依赖它 |
| type | 词条类型 | 如 word、num、CJK |
指定 field 时使用的是该字段映射里配置的 analyzer;keyword 字段的分析结果通常只有一个 token,因此 term 查询才要求整串相同。
索引期 analyzer 与查询期 search_analyzer 不一致会出现「写入能搜到、查不到」的假象,两侧都用 _analyze 各跑一遍最容易发现。
分析器名称写错会直接返回 400,先用不带参数的内置分析器确认名称拼写,再排查业务文本的切分问题。