9

我有一个弹性搜索索引,我无法使用映射设置每个字段,因此日期作为字符串输入......

有谁知道我将如何对该字符串日期进行排序?

我看过_script

{
    "query" : {
        ....
    },
    "sort" : {
        "_script" : {
            "script" : "doc['field_name'].value",
            "type" : "string",
            "order" : "asc"
        }
    }
}

但这失败了,因为它是一个分析领域......

任何建议都会很棒!

谢谢

4

2 回答 2

15

如果日期的格式已知,您可以将该格式添加到 dynamic_date_formats(查看此链接)设置。当您索引一个新的字符串字段时,它将被转换为可以按正常方式排序的日期类型。

例子:

创建没有属性的索引:

curl -XPUT http://localhost:9200/dates -d '
{
    "dates" : {
        "dynamic_date_formats" : ["yyyy-MM-dd", "dd-MM-yyyy"],
        "properties" : {
        }
    }
}'

索引 2 文件:

curl -XPUT 'http://localhost:9200/dates/dates/1' -d '
{
    "arbitraryDate": "2013-01-01"
}'

curl -XPUT 'http://localhost:9200/dates/dates/2' -d '
{
    "arbitraryDate": "2012-01-01"
}'

如果您检查映射,您将看到该字段不是字符串:

curl -XGET 'http://localhost:9200/dates/_mapping'

结果:

{
  "dates": {
    "dates": {
      "properties": {
        "arbitraryDate": {
          "type": "date",
          "format": "dateOptionalTime"
        }
      }
    }
  }
}

现在您可以轻松排序:

curl -XGET 'http://localhost:9200/dates/_search' -d '
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "arbitraryDate": {
        "order": "asc"
      }
    }
  ]
}'
于 2013-08-23T15:46:03.523 回答
0

您可以使用 Elasticsearch 无痛脚本,如下所示;

{
    "size": "100",
    "query": {
        "match_all": {}
    },
    "sort": [
        {
            "_script": {
                "type": "number",
                "script": {
                    "source": "String dateAsString = doc['field_name'].value; String dateformat = 'yyyy-MM-ddZ'; DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateformat); return ZonedDateTime.parse(dateAsString, formatter).toInstant().toEpochMilli()"
                },
                "order": "desc"
            }
        }
    ]
}
于 2022-01-26T06:59:48.713 回答