我们使用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
我们不再收到错误,但没有收到任何结果。
此时我们知道我们必须做错事,但不知道该去哪里。非常感谢所有帮助。
感谢@Richa:将日期转换为long(以毫秒为单位)后,查询似乎运行,但没有返回结果。
这是从昨天到今天的默认时间范围运行,并且在大约10天的手动时间范围内运行,我知道有大约300条记录。
我还能够使用当前的休息实现来验证是否存在数据,并且我能够使用rest客户端进行三重检查,但是没有用于spring数据的数据。
思考?
答案 0 :(得分:2)
我的项目也出现了这个错误。它使用Long
数据类型解决了。您正在使用的dynamic finder
提供的spring Data
正在date
中使用String
参数。将日期转换为毫秒,并在Long
中传递日期。使用方法为:
findMessagesByKeywordAndStartDateTimeBetween(String keyword, Long start, Long end);
希望这有帮助。