ElasticSearch 7.x单索引存储多类型字段可行性咨询
关于Elasticsearch 7.x存储多类型结构数据的疑问
我们的服务需接收多种类型的数据,希望存储到ElasticSearch以利用其搜索能力。数据类型包括字符串、数字、对象或对象数组,示例如下:
POST my-index/_doc/1 { "additionalData": [ { "values": { "some-field": "some-value", "some-other-field": "some-value" } } ] } POST my-index/_doc/1 { "additionalData": [ { "values": [12345, 9875] } ] } POST my-index/_doc/1 { "additionalData": [ { "values": "Some text" } ] }
请问是否可在ElasticSearch中存储这类数据?还是更适合使用MongoDB等其他NoSQL数据库?注:我们当前使用ElasticSearch 7.x,希望继续使用该工具。
解答
完全可以在Elasticsearch 7.x中存储这类多类型结构的数据,没必要切换到MongoDB,以下是具体的实现方案和注意事项:
用动态模板适配多类型字段
Elasticsearch默认的动态映射会在第一次写入时固定字段类型,后续写入不同类型会报错。解决办法是提前配置dynamic_templates,让additionalData.values能兼容多种类型:PUT my-index { "mappings": { "dynamic_templates": [ { "multi_type_values": { "path_match": "additionalData.*.values", "mapping": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 }, "numeric": { "type": "double", "ignore_malformed": true } }, "ignore_malformed": true } } } ] } }这里的
ignore_malformed参数允许字段接收不同类型的数据,同时为文本、精确关键词、数值分别建立子字段,既满足全文搜索,也支持精确匹配和数值聚合。避免类型冲突的关键配置
如果不提前配置映射,直接写入不同类型的values,会导致后续写入失败。所以必须开启ignore_malformed或者用动态模板预定义兼容规则,确保所有类型的数据都能正常写入。搜索时的针对性查询
搜索不同类型的values时,指定对应的子字段即可:- 搜索文本内容:用
additionalData.values字段 - 精确匹配字符串/对象:用
additionalData.values.keyword - 搜索数值:用
additionalData.values.numeric
- 搜索文本内容:用
你的核心需求是利用搜索能力,Elasticsearch在这方面比MongoDB专业得多,而且你已经在使用7.x版本,完全可以基于现有架构实现需求,不需要切换数据库。
内容的提问来源于stack exchange,提问作者SOufiane Fadil
相关产品推荐
相关产品推荐

