Elasticsearch技术问询:日期映射为text?product_ref字段映射报错求助
Elasticsearch 问题解答
问题1:能否将Elasticsearch中的date类型映射为text类型?
这个得分情况来看,不是直接就能改的:
- 如果你的索引还没有任何数据:完全可以直接修改该字段的映射类型为text,或者干脆删除索引重新创建一个包含正确映射的新索引。比如你可以用这个命令更新映射:
PUT /your_index/_mapping { "properties": { "your_date_field": { "type": "text" } } } - 如果索引已经有数据了:ES不允许直接修改已有字段的类型(因为底层存储结构已经固定了),这时候得用
reindex的方法:- 先创建一个新的索引,把目标字段的类型设置为text;
- 用
_reindexAPI把旧索引的数据迁移到新索引; - 可以给新索引设置和旧索引一样的别名,这样业务代码不用改就能切换过去。
问题2:JSON数据的product_ref字段推送至索引时出现映射错误,该如何解决?
这种错误大多是因为数据的实际类型/格式和索引里的映射不匹配,按这几步排查解决:
- 第一步:先搞清楚当前索引里product_ref字段的映射是什么样的,用这个命令查看:
看看它被设置成了什么类型(比如integer、date、keyword还是text)。GET /your_index/_mapping - 第二步:检查你推送的JSON数据里product_ref的实际值,对比映射类型:
- 比如映射是
integer,但数据里是带引号的字符串(比如"product_ref": "123")或者小数,就会报错; - 如果映射是
date,但数据里的格式不是ES认可的(比如"2023/10/01"而不是"2023-10-01T00:00:00Z"),也会触发错误。
- 比如映射是
- 第三步:根据问题类型解决:
- 如果是数据格式不对:修改推送的JSON数据,让product_ref的值符合映射的要求;
- 如果是映射设置错了:
- 索引无数据的话,直接修改映射为正确的类型;
- 索引有数据的话,参考问题1里的
reindex方法,重建索引并修正该字段的映射后迁移数据;
- 要是你暂时不确定数据类型,也可以开启字段的
dynamic: true让ES自动推断类型,但生产环境不推荐这么做,还是提前定义好明确的映射更稳妥。
内容的提问来源于stack exchange,提问作者Yacine Lazaar
相关产品推荐
相关产品推荐

