ElasticSearch-当日期列字段类型为索引中的文本/关键字时按日期范围过滤

问题描述 投票:0回答:1

我是 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 中是否有类似的方法?

我也看过一些类似的问题。到目前为止,更改数据类型似乎存在限制,我们需要一个并行多字段选项

date elasticsearch filter keyword
1个回答
0
投票

简短的回答是你不能,关键字数据类型不能作为范围运算符中的数据时间进行过滤。

如果您需要修复它,您可以重新索引数据并在再次索引之前更改映射

首先将数据重新索引到时间索引


    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"
      }
    }

© www.soinside.com 2019 - 2024. All rights reserved.