【发布时间】:2016-05-10 12:35:48
【问题描述】:
我们正在使用 spring data elasticsearch 库来查询我们的 elasticsearch 服务器。我们目前正在使用rest调用来获取结果并且已经成功,但是我们想使用该库。
我们发送的工作休息查询类似于
{
"query": {
"bool": {
"must": [
{ "range" : { "startDateTime" : { "from" : "2016-01-31T00:00:00", "to" : "2016-02-01T00:00:00" }}},
{ "match_phrase" : { "keyword" : "task" }}
]
}
}
}
使用我们创建的方法的spring data 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\"]
-
如果有帮助,该字段的映射是
“开始日期时间”:{ “类型”:“日期”, “格式”:“日期可选时间” },
-
我们尝试了许多格式和数据类型。当我们改变格式时 到
yyyMMddHHmmss
我们不再收到错误,但没有得到任何结果。
在这一点上,我们知道我们一定做错了什么,但不知道该去哪里。非常感谢所有帮助。
2016 年 2 月 2 日上午 10:15
感谢@Richa:将日期转换为长日期(以毫秒为单位)后,查询似乎运行了,但没有返回任何结果。
这是在从昨天到今天的默认时间范围内运行的,并且在大约 10 天的手动时间范围内运行,我知道大约有 300 条记录。
我还能够使用当前的 rest 实现来验证是否有数据,并且我可以使用 rest 客户端进行三重检查,但没有用于 spring data impl 的数据。
想法?
【问题讨论】:
-
您可以粘贴文档的映射部分吗?我认为 ES 中的映射使用不同的格式,这就是它不理解 2016-01-31T00:00:00.000Z 的原因。
-
你有一个索引还是多个索引?在后一种情况下,
startDateTime字段是否可能在所有索引中没有相同的映射? -
@Augusto 感谢您的回复!映射接近帖子末尾
"startDateTime": { "type": "date", "format": "dateOptionalTime" },... -
嘿,@Val 感谢您的回复,我会调查一下,我不确定。
标签: java rest elasticsearch spring-data spring-data-elasticsearch