在Elasticsearch中解析日期“2018年4月10日,07:32:45.987”

时间:2018-04-13 08:31:11

标签: elasticsearch jodatime

Heyo,我正在尝试使用Kibana创建索引模式,为此我需要在Elasticsearch中解析日期“2018年4月10日,07:32:45.987”。我的问题是10之后的“th”.Elasticsearch文档指出了joda-time文档:http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html,但这并没有告诉我它如何忽略或解析这两个字符。到目前为止,我有:

PUT mynewindex
{
  "mappings": {
    "mytype" : {
      "properties": {
        "syslog-timestamp" : {
          "type" : "date",
          "format" : "MMM dd?? yyyy, HH:mm:ss.SSS"
        }
      }
    }
  }
}

什么应该取代我的问号?

在Java中它看起来像这样:

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class JodaTimeTest {


    public JodaTimeTest() {
        String timeString = "April 10th 2018, 07:32:45.987";
        DateTimeFormatter formatter = DateTimeFormat.forPattern("MMM dd'th' yyyy, HH:mm:ss.SSS||MMM dd'nd' yyyy, HH:mm:ss.SSS||MMM dd'rd' yyyy, HH:mm:ss.SSS");
        DateTime dt = formatter.parseDateTime(timeString);
    }

    public static void main(String[] args) {
        new JodaTimeTest();
    }
}

我尝试了给定的解决方案,但结果是:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "April 10th 2018, 07:32:45.987" is too short
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:945)
    at JodaTimeTest.<init>(JodaTimeTest.java:11)
    at JodaTimeTest.main(JodaTimeTest.java:15)

额外信息:

GET myindex/_search
{
  "query": {
        "range" : {
            "date" : {
                "gt" :  "now"
            }
        }
    }
}

什么都不返回,

GET myindex/_search
{
  "query": {
        "range" : {
            "date" : {
                "lt" :  "now"
            }
        }
    }
}

也不会返回任何内容。

2 个答案:

答案 0 :(得分:1)

您需要这样做,并考虑ndrd的日期:

PUT mynewindex
{
  "mappings": {
    "mytype" : {
      "properties": {
        "syslog-timestamp" : {
          "type" : "date",
          "format" : "MMM dd'th' yyyy, HH:mm:ss.SSS||MMM dd'nd' yyyy, HH:mm:ss.SSS||MMM dd'rd' yyyy, HH:mm:ss.SSS"
        }
      }
    }
  }
}

答案 1 :(得分:0)

Val的答案不起作用,因为||不支持运算符。对于这个有限的测试,我写了一个脚本来从日志文件中删除st,nd和rd。如果测试成功,将更改haproxy以输出没有st,nd和rd的日期。