【问题标题】:Spring Data Elasticsearch Query Date FormatSpring Data Elasticsearch 查询日期格式
【发布时间】: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


【解决方案1】:

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

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

希望这会有所帮助。

【讨论】:

  • 谢谢!我现在意识到我尝试过这个,现在我没有收到错误,但我没有得到任何结果。我尝试了一个肯定包含结果的大日期范围,其余查询显示超过 300,但弹簧数据查询没有收到任何内容。有什么想法吗?
猜你喜欢
  • 2019-11-09
  • 2022-01-06
  • 2015-11-09
  • 2021-03-03
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多