【问题标题】:Find full date, not only year (Elasticsearch)查找完整日期,而不仅仅是年份 (Elasticsearch)
【发布时间】:2018-06-18 13:24:52
【问题描述】:

在正常情况下,我有填写日期,但对于某些记录,我的日期格式为 yyyy / yyyy-MM。在搜索结果中,我不想要只有年份的日期。

结构定义:

[premiere_date] => Array
  (
    [type] => date
    [format] => dd.MM.yyyy||MM.yyyy||yyyy||yyyy-MM-dd
 )

示例数据:

{'name': 'a', 'premiere_date': '1984-11-22'},
{'name': 'b', 'premiere_date': '1984-12'},
{'name': 'c', 'premiere_date': '1985'},

我想要的结果:

{'name': 'a', 'premiere_date': '1984-11-22'},
{'name': 'b', 'premiere_date': '1984-12'},

我尝试将格式添加到范围过滤器,有点不起作用

{
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "premiere_date": {
                            "gte": "1983-12-22",
                            "lt": "1988-03-21",
                            "format": "yyyy-MM-dd"
                        }
                    }
                }
            ]
        }
    }
}

【问题讨论】:

    标签: elasticsearch elasticsearch-2.0 elasticsearch-2.4


    【解决方案1】:

    Elasticsearch 将 "date" 数据类型的值转换为表示自 UTC 纪元以来的毫秒数的长整数。这是被索引和搜索的表示。所以 Elasticsearch 不会隐式知道源文档中的原始日期值只有年份。您的应用程序必须添加另一个表示日期分辨率的字段,并且搜索还必须过滤该字段。例如,

    {
      "query": {
        "bool": {
          "filter": {
            "range": {
              "premiere_date": {
                 "gte": "1983-12-22",
                 "lt": "1988-03-21"
              }
            }
          },
          "must_not": {
            "term": {
              "premiere_date_resolution": "year"
            }
          }
        }
      }
    } 
    

    【讨论】:

    • 但是当我恢复数据时,我得到的是相同的year。 (我希望避免添加额外的列。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多