Mapping 决定字段怎样存储和检索,Analysis 决定文本怎样变成词项。字段类型一旦与数据不匹配,后期通常要新建索引并重建数据,不能靠修改 Mapping 原地修复。
Table of contents
Open Table of contents
先区分 text 与 keyword
text 会经过分析器,适合全文检索;keyword 保留完整值,适合精确过滤、排序和聚合。商品标题常使用 multi-field,同时提供 title 文本字段与 title.keyword 精确字段。
| 数据 | 推荐类型 | 原因 |
|---|---|---|
| 商品标题 | text + keyword 子字段 | 搜索并支持精确用途 |
| 分类编码 | keyword | 不应分词 |
| 价格分 | long | 范围、排序、无浮点误差 |
| 上架时间 | date | 时间范围与日期聚合 |
| 是否可售 | boolean | 精确状态过滤 |
不要默认把任意 JSON 动态写入。字段名无限增长会造成 mapping explosion(映射爆炸),消耗堆并拖慢集群状态更新。对稳定业务索引使用 dynamic: strict,对不检索的扩展对象可禁用索引或明确使用扁平类型。
分析器是一条流水线
分析器由字符过滤器、分词器和词元过滤器组成。索引时与查询时通常使用兼容规则,否则查询词项无法命中索引词项。
"Java, JAVA!" → 字符清理 → [Java, JAVA] → lowercase → [java, java]
用 _analyze API保存代表性输入和期望 token,把它当成回归测试。Elastic 的文本分析文档解释了完整处理链。
修改结构要重建
使用带版本的物理索引和稳定别名:创建 products-v2,写入新 Mapping,全量 Reindex,再追平增量;校验文档数、抽样结果和代表性查询后,原子切换 products-read/products-write 别名。观察期内保留旧索引,回退时切回别名。
下一步
继续阅读09-04 Query DSL 与 Filter Context,让查询意图与评分、过滤边界对齐。