Spring Data Elasticsearch查询日期格式

时间:2016-02-01 21:50:52

标签: java rest elasticsearch spring-data spring-data-elasticsearch

我们使用spring数据elasticsearch库来查询我们的elasticsearch服务器。我们目前正在使用休息调用来获得结果并且已经成功,但我们想要使用该库。

我们发送的工作休息查询类似于

{
    "query": {
        "bool": {
            "must": [
                { "range" : { "startDateTime" : { "from" : "2016-01-31T00:00:00", "to" : "2016-02-01T00:00:00" }}},
                { "match_phrase" : { "keyword" : "task" }}
            ]
        }
    }
}

使用spring数据elasicsearch查询派生工具我们创建了方法

findMessagesByKeywordAndStartDateTimeBetween(String keyword, String start, String end);

派生到查询

{
    "from": 0,
    "query": {
        "bool": {
            "must": [
                {"query_string":{"query":"\"tasks\"","fields":["keyword"]}},
                {"range":{"startDateTime":{"from":"2016-01-31T00:00:00","to":"2016-02-01T00:00:00","include_lower":true,"include_upper":true}}}
            ]
        }
    }
}

我可以在rest客户端运行此查询并接收数据,但是,当库尝试查询数据库时,我收到错误

{
  "timestamp": 1454360466934,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.elasticsearch.action.search.SearchPhaseExecutionException",
  "message": "Failed to execute phase [query_fetch], all shards failed; shardFailures {
    [██████████████████████][████████████][0]: RemoteTransportException[
        [██████-██-███-███████][inet[/██.███.███.███:9300]]
            [indices:data/read/search[phase/query+fetch]]]; nested: SearchParseException[
                [████████████][0]: from[0],size[10]: Parse Failure [
                    Failed to parse source [
                        {\"from\":0,\"size\":10,\"query\":{\"bool\":{\"must\":[{\"query_string\":{\"query\":\"\"/tasks\"\",\"fields\":[\"method\"]}},{\"range\":{\"startDateTime\":{\"from\":\"2016-01-31T00:00:00.000Z\",\"to\":\"2016-02-01T00:00:00.000Z\",\"include_lower\":true,\"include_upper\":true}}}]}}}
                    ]   
                ]
            ]; 
    nested: NumberFormatException[For input string: \"2016-01-31T00:00:00.000Z\"]; 
  }",
  "path": "/report/tasks"
}

这使我们相信我们要求的日期不是正确的格式来引用数据库项目,但样本结果看起来像

{
    "_index": "████████████",
    "_type": "████████████",
    "_id": "████████████",
    "_score": 0.000,
    "_source": {
      "keyword": "tasks",
      "endDateTime": "2016-01-15T00:57:31.427Z",
      "startDateTime": "2016-01-15T00:57:30.201Z",
      "@timestamp": "2016-01-15T00:57:31+00:00",
      "responseBody": "{...stuff goes here...}"
    }
},...

所以你会认为你可以使用那种格式进行查询。

我们决定使用新查询

尝试使用tasks关键字获取所有结果
findMessagesByKeyword(String keyword);

派生于

{
    "from": 0,
    "query": {
        "bool": {
            "must": [
                {"query_string":{"query":"\"tasks\"","fields":["keyword"]}}
            ]
        }
    }
}

这将返回页面中的所有结果,并在将映射对象startDateTime和responseBody字段打印到控制台后

10: [
    [Thu Oct 15 18:55:53 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 18:56:38 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 18:56:49 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 18:58:59 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 18:59:16 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 18:59:33 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 18:59:54 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 19:00:02 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 19:00:02 EDT 2015, {...stuff goes here...}]
    [Thu Oct 15 19:00:11 EDT 2015, {...stuff goes here...}]
] //These are paged results, there are results as recently as last week, just not in this page 

我注意到日期时间字段现在采用不同的格式,因此我使用格式

public String DATETIME_FORMAT = "EE MMM dd HH:mm:ss zz yyyy";

而不是

public String DATETIME_FORMAT = "yyyy-MM-dd'T'00:00:00.000'Z'";

并获得错误

NumberFormatException[For input string: \"Sun Jan 31 00:00:00 EST 2016\"]
  • 如果有帮助,该字段的映射是

    “startDateTime”:{             “type”:“date”,             “format”:“dateOptionalTime”           },

  • 我们尝试了很多格式和数据类型。当我们改变格式时 到

    yyyMMddHHmmss

    我们不再收到错误,但没有收到任何结果。

此时我们知道我们必须做错事,但不知道该去哪里。非常感谢所有帮助。

2016年2月2日上午10:15

感谢@Richa:将日期转换为long(以毫秒为单位)后,查询似乎运行,但没有返回结果。

这是从昨天到今天的默认时间范围运行,并且在大约10天的手动时间范围内运行,我知道有大约300条记录。

我还能够使用当前的休息实现来验证是否存在数据,并且我能够使用rest客户端进行三重检查,但是没有用于spring数据的数据。

思考?

1 个答案:

答案 0 :(得分:2)

我的项目也出现了这个错误。它使用Long数据类型解决了。您正在使用的dynamic finder提供的spring Data正在date中使用String参数。将日期转换为毫秒,并在Long中传递日期。使用方法为:

findMessagesByKeywordAndStartDateTimeBetween(String keyword, Long start, Long end);

希望这有帮助。