弹性搜索:hour_minute_second映射returns空数据

Elastic search: hour_minute_second mapping returns empty data

下面是我为搜索字段创建的映射

PUT /sample/_mapping
{
  "properties": {
    "webDateTime1": {
      "type":   "date",
      "format": "dd-MM-yyyy HH:mm:ss||dd-MM-yyyy||hour_minute_second"
    }
  }
}

如果我根据“04-04-2019 20:17:18”搜索得到正确的数据 如果我根据“04-04-2019”进行搜索以获得正确的数据 如果我基于“20:17:18”进行搜索,我不知道总是会得到空结果。 任何帮助将不胜感激。

当您摄取一些示例文档时:

POST sample/_doc/1
{"webDateTime1":"04-04-2019 20:17:18"}

POST sample/_doc/2
{"webDateTime1":"04-04-2019"}

POST sample/_doc/3
{"webDateTime1":"20:17:18"}

然后在日期字段上聚合,

GET sample/_search
{
  "size": 0, 
  "aggs": {
    "dt_values": {
      "terms": {
        "field": "webDateTime1"
      }
    }
  }
}

您将看到这些值 实际上 是如何编入索引的:

...
"buckets" : [
        {
          "key" : 73038000,
          "key_as_string" : "01-01-1970 20:17:18",
          "doc_count" : 1
        },
        {
          "key" : 1554336000000,
          "key_as_string" : "04-04-2019 00:00:00",
          "doc_count" : 1
        },
        {
          "key" : 1554409038000,
          "key_as_string" : "04-04-2019 20:17:18",
          "doc_count" : 1
        }
      ]
...

这就是您对 20:17:18 的查询让您头疼的原因。

现在,您通常希望像这样使用 range 查询:

GET sample/_search
{
  "query": {
    "range": {
      "webDateTime1": {
        "gte": "20:17:18",
        "lte": "20:17:18",
        "format": "HH:mm:ss"
      }
    }
  }
}

注意 format 参数。但同样,如果您不在 datetime 字段中提供 date,结果将采用 unix 纪元作为日期。