ElasticSeach - 按日期排序

use*_*082 6 date elasticsearch

我有一个弹性搜索索引,我不能用映射设置每个字段,所以日期以字符串形式进行...

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

我看过_script

{
    "query" : {
        ....
    },
    "sort" : {
        "_script" : {
            "script" : "doc['field_name'].value",
            "type" : "string",
            "order" : "asc"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这失败了因为它的分析领域......

任何建议都会很棒!

谢谢

mol*_*are 8

如果已知日期格式,则可以将该格式添加到dynamic_date_formats(签出此链接)设置.索引新字符串字段时,它将转换为日期类型,可以按正常方式排序.

例:

创建没有属性的索引:

curl -XPUT http://localhost:9200/dates -d '
{
    "dates" : {
        "dynamic_date_formats" : ["yyyy-MM-dd", "dd-MM-yyyy"],
        "properties" : {
        }
    }
}'
Run Code Online (Sandbox Code Playgroud)

索引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"
}'
Run Code Online (Sandbox Code Playgroud)

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

curl -XGET 'http://localhost:9200/dates/_mapping'
Run Code Online (Sandbox Code Playgroud)

结果:

{
  "dates": {
    "dates": {
      "properties": {
        "arbitraryDate": {
          "type": "date",
          "format": "dateOptionalTime"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以轻松排序:

curl -XGET 'http://localhost:9200/dates/_search' -d '
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "arbitraryDate": {
        "order": "asc"
      }
    }
  ]
}'
Run Code Online (Sandbox Code Playgroud)