Lucene日期范围查询无结果及语法错误问题求助
解决Lucene查询Elasticsearch日期范围无结果/语法错误的问题
我明白你因为特定需求必须用Lucene查询而不能用过滤器,现在咱们来一步步解决你遇到的问题:
1. 先解决带空格日期的语法错误
你用FileLoadedToElasticDateTime:[2018-01-01 00:00:00 TO 2018-12-31 18:00:00]查询时出错,核心原因是Lucene会把空格当成查询语句的分隔符,导致解析器无法正确识别范围表达式。
正确的写法是给每个日期值加上双引号,把带空格的日期字符串完整包裹起来,这样Lucene就能正确解析了:
FileLoadedToElasticDateTime:["2018-01-01 00:00:00" TO "2018-12-31 23:59:59"]
2. 为什么其他语法无报错但返回零结果
你的字段映射格式是yyyy-MM-dd hh:mm:ss,这意味着Elasticsearch存储该字段时严格使用这个带空格的格式。你之前尝试的:
FileLoadedToElasticDateTime:[2018-01-01 TO 2018-12-31](缺少时间部分)FileLoadedToElasticDateTime:[20180101 TO 20181231](无分隔符的格式)FileLoadedToElasticDateTime:[2018-01-01T00:00:00 TO 2018-12-31T18:00:00](用T分隔日期时间,而非空格)
这些格式都和字段的实际存储格式不匹配,Lucene无法找到对应的数据,所以返回零结果。
3. 额外注意点
- 映射里的
hh是12小时制的小时标识,如果你的实际数据是24小时制(比如18:00这种下午时间),映射应该改为yyyy-MM-dd HH:mm:ss(大写HH),否则时间存储会有问题,查询也会受影响。 - 如果只需要2018年全年数据,也可以尝试ES支持的年份范围简化写法(前提是字段是日期类型,ES能自动识别转换):
不过还是优先推荐完全匹配映射格式的带引号查询,避免格式转换带来的问题。FileLoadedToElasticDateTime:[2018-01-01 TO 2018-12-31]
内容的提问来源于stack exchange,提问作者Ed Baker
相关产品推荐
相关产品推荐

