首页/数据/NoSQL 速查/_analyze 测试分词结果
Elasticsearch89 条

_analyze 测试分词结果

分词器决定文本如何切分与归一化:用 _analyze 可直接观察 analyzer 或自定义 tokenizer + filter 链条的输出,是排查查询无命中的常用手段。

NoSQL 速查数据更新于 2026-10-13

_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 只有一个 token

token 输出字段

字段含义读法
token切分后的词条查询能否命中取决于它
start_offset起始字符偏移定位原文位置
end_offset结束字符偏移与 start 一起圈定范围
position词条位置序号match_phrase 依赖它
type词条类型如 word、num、CJK
指定 field 时使用的是该字段映射里配置的 analyzer;keyword 字段的分析结果通常只有一个 token,因此 term 查询才要求整串相同。
索引期 analyzer 与查询期 search_analyzer 不一致会出现「写入能搜到、查不到」的假象,两侧都用 _analyze 各跑一遍最容易发现。
分析器名称写错会直接返回 400,先用不带参数的内置分析器确认名称拼写,再排查业务文本的切分问题。

易错点

  • 查询侧与索引侧分析器不一致会造成无命中,排查必须同时验证两侧的 _analyze 输出
  • 对 keyword 字段用分词后的查询串去匹配(或反过来)语义会错位,字段类型先确认再定查询方式
  • 中文用 standard 分析器会按单字切分,短语匹配效果与预期差距很大,中文场景要换合适的分词器
  • 把 analyzer 名称写错只会得到 400,容易被误判成分词插件没装,先核对名称拼写
  • 只验证索引期分析器忽略查询期,问题会漏掉一半,两侧都要跑 _analyze 对比

数据来源与参考

  • Elasticsearch Guide: Analyze API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌