ElasticSearch - 按日期排序

时间:2013-08-23 14:22:07

标签: date elasticsearch

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

有谁知道如何在字符串日期进行排序?

我看过_script

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

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

任何建议都会很棒!

由于

1 个答案:

答案 0 :(得分:8)

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

示例:

创建没有属性的索引:

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