【问题标题】:Elastic search: hour_minute_second mapping returns empty data弹性搜索:hour_minute_second 映射返回空数据
【发布时间】:2020-07-15 15:53:18
【问题描述】:

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

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”搜索不知道总是得到空结果。 任何帮助将不胜感激。

【问题讨论】:

    标签: elasticsearch elasticsearch-mapping


    【解决方案1】:

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

    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 纪元作为日期。

    【讨论】:

    • 我可以看到下面的结果导致我的聚合 "aggregations" : { "dt_values" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : 1554322638000, “key_as_string”:“03-04-2019 20:17:18”,“doc_count”:2},{“key”:1554409038000,“key_as_string”:“04-04-2019 20:17:18”,“doc_count” " : 2 } ] } } 在搜索搜索查询时它给了我空的结果。
    • 这是因为您的所有 4 个文档都包含日期时间,而不是日期。改用这个:{"query":{"range":{"webDateTime1":{"gte":"03-04-2019 20:17:18","lte":"04-04-2019 20:17:18","format":"dd-MM-yyyy HH:mm:ss"}}}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多