我是 ElasticSearch 的新手,正在寻求帮助。 ElasticSearch 版本是“7.3.2”。
我们有一个索引,其中 startDate 列被定义为关键字类型。因此,当我们像下面这样编写日期查询时,会发生词法比较,并且查询结果不符合预期。
下面的列定义:
"createTime": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"fielddata": true
},
数据以“createTime”的格式存储:“2023-09-05T01:36:49.771245”
我尝试过的查询如下所示:
{
"sort": {
"createTime": "desc"
},
"query": {
"bool": {
"filter": [
{
"range": {
"createTime": {
"gte": "2023-09-05T01:36:44.896855100",
"lte": "2023-09-05T01:37:29.503598900",
"format": "yyyyMMdd'T'HHmmss.SSS"
}
}
}
]
}
}
}
我也看过一些类似的问题。到目前为止,更改数据类型似乎存在限制,我们需要一个并行多字段选项。
此参考已有 3 年历史。因此,寻找任何新的替代方法来解决我的问题。
SQL中有一些像to_date这样的函数,通常可以解决RDBMS中的此类问题。 ElasticSearch 中是否有类似的方法?
我也看过一些类似的问题。到目前为止,更改数据类型似乎存在限制,我们需要一个并行多字段选项
简短的回答是你不能,关键字数据类型不能作为范围运算符中的数据时间进行过滤。
如果您需要修复它,您可以重新索引数据并在再次索引之前更改映射
首先将数据重新索引到时间索引
POST _reindex
{
"source": {
"index": "your-index"
},
"dest": {
"index": "your-index-temp"
}
}
当reindex为donde时(检查两个索引的doc count必须相同)删除原来的索引
DELETE your-index
现在应用新映射
PUT /your-index/_mapping
{
"properties": {
"mi-campo": {
"type": "date",
"format": "yyyyMMdd'T'HHmmss.SSS"
},
// Other fields if you need to map
}
}
并再次重新索引形成临时索引的
POST _reindex
{
"source": {
"index": "your-index-temp"
},
"dest": {
"index": "your-index"
}
}