背景
mongodb中有一个字段名称叫value
,这个字段对应的值会有多种数据类型,string、number、datetime
,现在这部分数据会被同步到Elasticsearch中
遇到问题
但是由于在es中创建index的时候,需要指定mappings
,然后这个字段的值类型不固定,不能在mappings
中显示的指定所属类型,因为一旦固定的指定所属类型之后,就会影响到查询,比如指定为text
,则number
和datetime
的范围查询将不会生效
解决思路
开始考虑的是es的dynamic_mapping,但详细了解之后,发现这个是针对在同步数据进入es的时候对未知字段进行动态映射所属类型,并不能解决我的问题,后来在多方查询了解之后,在这篇博文中找到了解决方案
解决方案示例
创建测试index
PUT test_data_type?include_type_name=true
{
"mappings":{
"_doc":{
"properties":{
"value":{
"type":"text",
"fields":{
"numeric":{
"type":"double",
"ignore_malformed":true
},
"date":{
"type":"date",
"ignore_malformed":true
}
}
}
}
}
}
}
放入测试数据
// 插入字符串数据
PUT test_data_type/_doc/1
{
"value": "test_string"
}
// 插入数字数据
PUT test_data_type/_doc/2
{
"value": 99
}
// 插入日期数字
PUT test_data_type/_doc/3
{
"value": "2022-08-01T03:48:37.178Z"
}
执行查询测试
// 日期类型测试
GET multiple_datatypes/_search
{
"query": {
"range": {
"value.date": {
"lte": "2022-08-31T03:48:37.178Z"
}
}
}
}
// 数字类型测试
GET multiple_datatypes/_search
{
"query": {
"range": {
"value.numeric": {
"gte": 11
}
}
}
}
// 字符串类型测试
GET multiple_datatypes/_search
{
"query": {
"term": {
"value": {
"gte": "test_string"
}
}
}
}
以上查询均能按照预定结果输出