如何定义兼容字符串或对象数组的Elasticsearch映射
Elasticsearch 兼容字符串/对象数组的通用映射配置
要同时存储元素为字符串或含alternateName、areaCategory字段的对象的数组,可利用Elasticsearch的object类型灵活性,结合dynamic参数实现兼容,具体映射配置如下:
{ "mappings": { "properties": { "target_array": { "type": "object", "dynamic": true, "properties": { "alternateName": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "areaCategory": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }
配置说明
type: "object":Elasticsearch会自动将数组中的对象结构化存储;当数组元素是字符串时,会被当作对象的“根值”存入_source,不会触发字段冲突。dynamic: true:允许自动识别对象中的新增字段(若后续对象有其他字段也能兼容),不需要自动新增字段可设为false。- 为
alternateName和areaCategory同时配置text和keyword类型:既支持全文搜索,也支持精确匹配、聚合操作。
测试示例
插入混合类型数组的文档:
{ "target_array": [ "北京", {"alternateName": "沪", "areaCategory": "直辖市"}, {"alternateName": "粤", "areaCategory": "省份"} ] }
该文档可正常存储,且能分别对字符串元素和对象字段进行查询:
- 查询字符串元素:
match: { "target_array": "北京" } - 查询对象字段:
term: { "target_array.areaCategory.keyword": "直辖市" }
内容的提问来源于stack exchange,提问作者Sankhnad Mishra
相关产品推荐
相关产品推荐

