elasticsearch - Elasticsearch 日期范围问题
问题描述
我正在学习 Elasticsearch,但对日期范围查询有疑问。我的查询只比较日期,而不是整个日期。这是一个简短的示例:
DELETE test
PUT /test
{
"mappings": {
"properties": {
"date" : {
"type": "date",
"format": "dd MM YYYY"
}
}
}
}
POST /_bulk
{"index" : {"_index": "test"}}
{"date": "01 01 2001"}
POST /test/_search
{
"query": {
"range": {
"date": {
"lt": "01 01 2016",
"gt": "01 01 2000"
}
}
}
}
POST /test/_search
{
"query": {
"range": {
"date": {
"lte": "01 01 2000",
"gte": "01 01 2016"
}
}
}
}
据我了解,第一个搜索查询应该返回文档 - 日期 2001 是 < 2016 和 > 2000。第二个查询应该什么都不返回,因为 2001 不是 <= 2000 和 >=2016。但它的作用完全相反。
你能指出我缺少什么吗?
解决方案
它失败的原因是因为 ES 没有正确格式化您的日期。日期格式化行为在 6.x 和 7.0 之间发生了变化,并且基于 joda 的日期格式化程序被替换为 java 的。如果您将格式更改为"format": "dd MM yyyy"
(注意小写yyyy
),您会发现您的搜索有效。
格式不起作用的原因是YYYY
表示date week year。您几乎总是希望在日期格式中使用小写yyyy
格式来表示您的年份。
推荐阅读
- oracle-adf - 瞬态 VO 迭代器没有返回正确的索引
- c# - 在更新所有属性之前如何观察对象的状态?
- java - 在二维数组中查找所有最短路径
- vuejs2 - 如何在vue中正确显示图像
- c++ - 将二维数组传递给 c & c++ 中的函数
- clang - Clang 优化了函数中的“ror”指令,但不是在函数内联时
- reactjs - 在 React 中将状态从孩子传递给父母,但父母的状态落后于孩子的状态
- android - Android - Oracle 12c 数据库连接问题:java.sql.SQLException:ORA-28040:没有匹配的身份验证协议
- python - 在写入数据之间不关闭和重新打开端口的情况下,无法使用 Pyserial 两次写入串行端口
- javascript - 水平和按比例调整正弦波的大小 - js