elasticsearch,nullable,Php,Datetime,Search,elasticsearch,Nullable" /> elasticsearch,nullable,Php,Datetime,Search,elasticsearch,Nullable" />

Php 在elasticsearch索引中存储带有可选参数的datetime?

Php 在elasticsearch索引中存储带有可选参数的datetime?,php,datetime,search,elasticsearch,nullable,Php,Datetime,Search,elasticsearch,Nullable,因此,我正在开发一个应用程序,我需要一个搜索工具来索引照片和文档-但有时我不知道文档的确切月份或日期,所以直到现在,我一直将日期存储在MySQL表中,作为date或datetime字段,该字段允许可选值: 2015-03-11 // Valid MySQL date 2015-12-00 // Also a valid MySQL date, but a null day to represent 'it is not known' 2015-00-00 // Another valid MyS

因此,我正在开发一个应用程序,我需要一个搜索工具来索引照片和文档-但有时我不知道文档的确切月份或日期,所以直到现在,我一直将日期存储在MySQL表中,作为
date
datetime
字段,该字段允许可选值:

2015-03-11 // Valid MySQL date
2015-12-00 // Also a valid MySQL date, but a null day to represent 'it is not known'
2015-00-00 // Another valid MySQL date, with a null date and month to represent 'this document came from the year 2015, but at some unknown point'
现在,这实际上运行得很好,MySQL仍然会以适当的方式对日期进行排序

然而,现在我开始使用Elasticsearch构建搜索工具,它显然对这种语法不满意。尝试索引日期时间值“超出范围”的文档(例如
2015-00-00
)会导致以下响应:

{
    "error":"MapperParsingException[failed to parse [originated_at]]; nested: MapperParsingException[failed to parse date field [2015-00-00], tried both date format [dateOptionalTime], and timestamp number with locale []]; nested: IllegalFieldValueException[Cannot parse \"2015-00-00\": Value 0 for monthOfYear must be in the range [1,12]]; ",
    "status":400
}
原因很明显。然而,可选日期是一个要求,我需要我选择的解决方案来允许这一点


获取Elasticsearch以允许我存储可选日期属性并仍然能够按日期排序和搜索的最佳方法是什么?

在映射中,您可以用
|
分隔日期字段,如下所示:

{
    "date_field": {
        "type": "date",
        "format": "yyyy||yyyy-MM||yyyy-MM-dd"
    }
}
因此,您将能够存储以下任何日期:

  • 2015年(即
    yyyy
  • 2015-12(即
    yyyy-MM
  • 2015-12-01(即yyyy-MM-dd)
试试看。

设置映射:

{
    "yourIndex": {
        "properties": {
            "date": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss"
            }
        }
    }
}

另外,请查看-Elasticsearch映射日期格式。

那么我应该将其存储在哪里?如果我只需要运行一次映射声明,我如何管理它而不是每次需要为对象编制索引时都运行它?您只需在映射中使用该字段声明,并在开始为数据编制索引之前只放置一次映射,即可将其放入应用程序中。无需每次都放置映射。Val,这很有意义,但我想不出在我的应用程序中有一个位置只调用一次。。。我是否需要查询索引是否存在,如果不存在,则添加映射?然后我建议使用,即,您使用正确的映射创建模板,然后每当将给定类型的第一个文档发送到ES时,将使用正确的映射创建索引。还没有时间,忙着工作和上大学——不过这是我待办事项清单上的下一件事:)那么我应该把它存放在哪里呢?如果我只需要运行一次映射声明,我如何管理它而不是每次需要为对象编制索引时都运行它?我知道,这只是在我的应用程序中放置映射的位置,因为如果我将其放置在我的
indexObject
函数中,则每次我索引对象时都会调用映射;但理想情况下,映射是一个“运行一次”场景,只需要在我创建索引时调用它(也就是在我的应用程序第一次运行时)。