用于自定义日期的Elasticsearch设置格式

时间:2019-06-10 16:34:29

标签: datetime elasticsearch

这是我的日期格式:

val encodedImage: String
val imageBytes = android.util.Base64.decode(encodedImage, 0)

根据Elasticsearch文档,我可以这样做:

10:00 2019-06-03

但是,当我这样做时,它不会将其识别为日期(因此将其转换为时间戳。有人知道为什么吗?

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

1 个答案:

答案 0 :(得分:2)

假设我们对您所遇到的date字段具有以下映射

PUT <your_index_name>
{  
   "mappings":{  
      "properties":{  
         "date":{  
            "type":"date",
            "format":"HH:mm yyyy-MM-dd||yyyy-MM-dd HH:mm"
         }
      }
   }
}

注意我如何添加两种不同类型的 date formats

现在让我添加两个文档:

POST mydate/_doc/1
{
  "date": "10:00 2019-06-03"
}

POST mydate/_doc/2
{
  "date": "2019-06-03 10:00"
}

请注意上述两个日期值。 Semantically的含义完全相同。查询时必须保留它。

现在,如果用户要基于语义<​​em> 来搜索日期值应该是什么,那么他/她应该同时获得两个文档。

POST <your_index_name>/_search
{
  "query": {
    "match": {
      "date": "10:00 2019-06-03"
    }
  }
}

响应:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "mydate",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "date" : "10:00 2019-06-03"
        }
      },
      {
        "_index" : "mydate",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "date" : "2019-06-03 10:00"
        }
      }
    ]
  }
}

在响应中观察到的是什么。这两个文件都被退回。

这只有在存储值的基本机制完全相同的情况下才有可能。在倒排索引中,这两个值将存储为相同的long号。

现在,如果您删除该语义定义,那么这两个值就和简单的字符串没有什么不同,您知道10:00 2019-06-032019-06-03 10:00都是不同的,并且遵守 semantics < / em>字符串应该是什么(如果date的执行方式是这样,为什么要完全使用date数据类型,这是正确的)。

我们在映射中指定为format的是日期值应如何显示给用户。

请注意此link中的以下信息:

  

内部将日期转换为UTC(如果指定了时区)   并存储为一个整数,表示自纪元以来的毫秒数。

     

日期查询在内部转换为与此相关的范围查询   长表示形式以及聚合和存储字段的结果   根据日期格式转换回字符串   与该字段相关联。

希望这会有所帮助!