ElasticSearch索引数据时不遵循自定义映射的问题
问题分析:Elasticsearch接受字符串类型的integer字段值
嘿,我来帮你拆解下这个问题~你已经设置了dynamic: strict,而且把age字段定义成integer类型,但传入字符串格式的数字(比如"4")却依然能成功索引,这其实是Elasticsearch的**自动类型转换(coerce)**在起作用。
为什么会这样?
dynamic: strict的作用是阻止新增未定义的字段,但它不会阻止已定义字段的类型兼容转换。Elasticsearch默认会开启coerce功能,当你传入的字段值类型和定义的类型不匹配但可以兼容转换时,ES会自动帮你转换类型:
- 字符串类型的数字(比如
"4")会被转换成整数4 - 整数也能被转换成字符串(如果字段是text类型)
这就是为什么你的代码里传入"4"不会报错,ES已经悄悄把它转成整数存起来了。你可以查询一下这个文档,会发现age的实际值是数字4而不是字符串。
如何严格阻止这种转换?
如果你想完全严格校验类型,不允许自动转换,可以在字段定义里添加"coerce": false参数,修改你的mappings部分:
from elasticsearch import Elasticsearch es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) # index settings settings = { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "members": { "dynamic": "strict", "properties": { "name": { "type": "text" }, "age": { "type": "integer", "coerce": false # 新增这一行,关闭自动类型转换 }, } } } } if not es.indices.exists('family'): es.indices.create(index='family', ignore=400, body=settings) print('Created Index') data = {'name': 'Maaz', 'age': "4"} result = es.index(index='family', id=2, doc_type='members', body=data) print(result)
修改后再运行代码,ES就会抛出类型不匹配的错误,符合你预期的严格校验效果。
内容的提问来源于stack exchange,提问作者Volatil3
相关产品推荐
相关产品推荐

