当前位置: 首页 > 面试题库 >

在Elasticsearch查询中格式化日期(在检索过程中)

薛保臣
2023-03-14
问题内容

我有一个带有以下映射的字段“ aDate”(以及许多其他字段)的elasticsearch索引

"aDate" : {
        "type" : "date",
        "format" : "date_optional_time"
}

当我查询文件时,我得到类似的结果

"aDate" : 1421179734000,

我知道这是时代,内部的java / elasticsearch日期格式,但是我想要一个类似的结果:

"aDate" : "2015-01-13T20:08:54",

我玩脚本

{  
 "query":{  
   "match_all":{

   }
 },
 "script_fields":{  
   "aDate":{  
      "script":"if (!_source.aDate?.equals('null')) new java.text.SimpleDateFormat('yyyy-MM-dd\\'T\\'HH:mm:ss').format(new java.util.Date(_source.aDate));"
   }
 }
}

但是它给出了奇怪的结果( 脚本基本上可以正常工作,但是aDate是唯一返回的字段,而_source丢失了 )。看起来像

"hits": [{
        "_index": "idx1",
        "_type": "type2",
        "_id": "8770",
        "_score": 1.0,
        "fields": {
            "aDate": ["2015-01-12T17:15:47"]
        }
    },

如果可能的话,我希望没有脚本的解决方案。


问题答案:

在Elasticsearch中运行查询时,您可以请求其返回原始数据,例如,指定字段:

curl -XGET http://localhost:9200/myindex/date-test/_search?pretty -d '
{
 "fields" : "aDate",
 "query":{  
   "match_all":{

   }
 }
}'

将以您最初存储日期的格式为您提供日期:

{
  "_index" : "myindex",
  "_type" : "date-test",
  "_id" : "AUrlWNTAk1DYhbTcL2xO",
  "_score" : 1.0,
  "fields" : {
    "aDate" : [ "2015-01-13T20:08:56" ]
  }
}, {
  "_index" : "myindex",
  "_type" : "date-test",
  "_id" : "AUrlQnFgk1DYhbTcL2xM",
  "_score" : 1.0,
  "fields" : {
    "aDate" : [ 1421179734000 ]
  }

除非使用脚本,否则无法更改日期格式。

curl -XGET http://localhost:9200/myindex/date-test/_search?pretty -d '
{  
 "query":{  
   "match_all":{ }
 },
 "script_fields":{  
   "aDate":{  
      "script":"use( groovy.time.TimeCategory ) { new Date( doc[\"aDate\"].value )  }"
   }
 }
}'

将返回:

{
  "_index" : "myindex",
  "_type" : "date-test",
  "_id" : "AUrlWNTAk1DYhbTcL2xO",
  "_score" : 1.0,
  "fields" : {
    "aDate" : [ "2015-01-13T20:08:56.000Z" ]
  }
}, {
  "_index" : "myindex",
  "_type" : "date-test",
  "_id" : "AUrlQnFgk1DYhbTcL2xM",
  "_score" : 1.0,
  "fields" : {
    "aDate" : [ "2015-01-13T20:08:54.000Z" ]
  }
}

要应用格式,请按如下所示附加格式:

"script":"use( groovy.time.TimeCategory ){ new Date( doc[\"aDate\"].value ).format(\"yyyy-MM-dd\")   }"

将返回 "aDate" : [ "2015-01-13" ]

要显示T,您需要使用引号,但将其替换为等效的Unicode:

"script":"use( groovy.time.TimeCategory ){ new Date( doc[\"aDate\"].value ).format(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss\") }"

退货 "aDate" : [ "2015-01-13T20:08:54" ]

返回script_fields和源

在查询中使用 _source 指定要返回的字段:

curl -XGET http://localhost:9200/myindex/date-test/_search?pretty -d '
 {  "_source" : "name",
  "query":{
    "match_all":{ }
  },
  "script_fields":{
    "aDate":{
       "script":"use( groovy.time.TimeCategory ) { new Date( doc[\"aDate\"].value )  }"
    }
  }
 }'

将返回我的name字段:

"_source":{"name":"Terry"},
  "fields" : {
    "aDate" : [ "2015-01-13T20:08:56.000Z" ]
  }

使用星号将返回所有字段,例如: "_source" : "*",

"_source":{"name":"Terry","aDate":1421179736000},
  "fields" : {
    "aDate" : [ "2015-01-13T20:08:56.000Z" ]
  }


 类似资料:
  • 问题内容: 我想在Elasticsearch中添加一个日期时间字符串时遇到问题。 该文件如下: 该文档提出了一个错误 我知道我可以在Elasticsearch中使用日期格式,但是即使阅读网站上的文档,我也不知道如何使用。 和 错了。 如何在Elasticsearch中将datetime字符串转换为日期格式? 如何将datetime字符串直接存储到Elasticsearch中? 问题答案: 你快到了

  • 我正在使用now()在Dataweave中获取当前日期时间,我想对其进行格式化,以便删除特殊字符,并且我得到这样的纯格式 20200723T1720334450200

  • 问题内容: 如何在AngularJS中正确显示日期和时间? 下面的输出同时显示输入和输出,带有和不带有AngularJS日期过滤器: 打印: 所需的显示格式为 或 问题答案: v.Dt可能不是Date()对象。 参见http://jsfiddle.net/southerd/xG2t8/ 但在您的控制器中:

  • 我刚Java /Spring/Thymeleaf,所以请接受我目前的理解水平。我确实复习了这个类似的问题,但没能解决我的问题。 我试图得到一个简化的日期,而不是长日期格式。 ​ html格式: 电流输出

  • 问题内容: 我在移动设备上使用本地数据库,在我的数据库中,我的date字段具有column name 。我的列值是这种格式,我想获取给定日期的数据。我在下面的数据库列和值中尝试过的确切查询是什么 ** RN_CREATE_DATE 2012-07-27 11:04:34 2012-05-28 10:04:34 2012-07-22 09:04:34 ** 但没有找到结果,请帮我解决这个问题。 问题

  • 我试图得到两个日期的millis值并将它们减去另一个。当我使用ctx._sourse.begin_time.toInstant(). toEpochMilli()像它给我运行时错误。和(像这样使用现有列值更新弹性搜索的所有文档)给我运行时错误 < code>ctx的类型。_source如果此代码工作正常< code > doc[' begin _ time ']. value . to insta