ElasticSearch - 按日期排序

9
我有一个弹性搜索索引,无法为每个字段设置映射,因此日期以字符串形式输入... 有人知道我该如何对这个字符串日期进行排序吗? 我已经查看了_script。
{
    "query" : {
        ....
    },
    "sort" : {
        "_script" : {
            "script" : "doc['field_name'].value",
            "type" : "string",
            "order" : "asc"
        }
    }
}

但这样做失败了,因为它是一个经过分析的字段...

有任何建议都可以!

谢谢

2个回答

15
如果已知日期的格式,您可以将该格式添加到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"
      }
    }
  ]
}'

您的链接已过期@moliware。请将其替换为新的elastic.co域名:https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html - Sipty

1
您可以像下面这样使用Elasticearch的无痛脚本;
{
    "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"
            }
        }
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接