solrj 7.7.3
在solr官方文档上,对日期格式的要求和表达如下:
Solr 日期格式
Solr 的日期字段(
DatePointField
,DateRangeField
和已过时的
TrieDateField
)代表“datas”,如时间精确到毫秒的点。使用的格式是XML Schema规范中 dateTime
的规范化表示形式的限制形式,这是 ISO-8601 的一个受限子集。对于那些熟悉 Java 8 的人来说,Solr 使用
DateTimeFormatter.ISO_INSTANT 进行格式化,并使用 “leniency” 进行解析。如以下示例:
YYYY-MM-DDThh:mm:ssZ
其中:
- YYYY 是表示年份。
- MM 是表示月份。
- DD 是表示月份的某一天。
- hh 是表示一天24小时的时间。
- mm 是表示分钟。
- ss 是表示秒。
- Z 是一个字面的“Z”字符,表示该日期的字符串表示形式是 UTC。
请注意,
不能指定时区
。日期的字符串表示形式始终以协调世界时 (UTC) 表示。这是一个示例值:
1972-05-20T17:33:18Z
Solr 日期范围格式
Solr 的 DateRangeField
支持上面描述的时间段语法中的相同点(具有下面描述的日期数学)以及更多的表达日期范围。一类示例是截断的日期,它表示整个日期跨度到所指示的精度。另一个类使用范围语法(TO
)。下面是一些示例:
- 2000-11:2000年11月的整个月
- 2000-11T13:同样,但在一天中的一个小时(1300至1400前,即下午1点至2点)。
- -0009:公元前10年,年份中的 0 是公元 0,也被认为是公元前1年。
- [2000-11-01 TO 2014-12-01]:指定的日期范围在一天的分辨率。
- [2014 TO 2014-12-01]:从 2014 年开始到 12 月的第一天结束。
- [* TO 2014-12-01]:从最早的可代表时间到2014年12月12日的一天结束。
限制
:范围语法不支持嵌入日期数学。如果您指定了 DatePointField 支持的日期实例,并将日期数学截断,比如 NOW/DAY,那么您仍然可以得到当天的第一个毫秒,而不是整天的范围。独占范围(使用{&})在查询中工作,但不适用于索引范围。
了解了上面的信息知识,那就好办啦!以此类推,想要时间范围就是["+dateString1+" TO "+dateString2+"]
;那么查询条件就是 查询字段:["+sdf.format(new Date())+" TO "+sdf.format(new Date())+"]
Solr 实际应用
我这里是archiveTime你们根据自己实际情况调整
核心代码:
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
StringBuffer fqBuffer = new StringBuffer();
String archiveTime = "archiveTime:[" + sdf.format(inputFormat.parse(params.getArchiveStartTime())) + " TO " + sdf.format(inputFormat.parse(params.getArchiveEndTime())) + "]";
fqBuffer.append("(").append(archiveTime).append(")");//归档时间
实际代码如下
/**
* 处理查询filterQuery
* @return
*/
private StringBuffer dealFilterQuery(ArchiveInfoParam params) {
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
StringBuffer fqBuffer = new StringBuffer();
boolean isFirstCondition = true;
if (ObjectUtils.isNotEmpty(params.getName())) {
if (!isFirstCondition) {
fqBuffer.append(" AND ");
}
fqBuffer.append("name:").append(params.getName()); // 题名
isFirstCondition = false;
}
if (ObjectUtils.isNotEmpty(params.getArchiveStartTime()) && ObjectUtils.isNotEmpty(params.getArchiveEndTime())) {
if (!isFirstCondition) {
fqBuffer.append(" AND ");
}
try {
String archiveTime = "archiveTime:[" + sdf.format(inputFormat.parse(params.getArchiveStartTime())) + " TO " + sdf.format(inputFormat.parse(params.getArchiveEndTime())) + "]";
fqBuffer.append("(").append(archiveTime).append(")");//归档时间
} catch (ParseException e) {
throw new RuntimeException(e);
}
isFirstCondition = false;
}
return fqBuffer;
}
好了,朋友们,今天就到这里了,喜欢的朋友们还请留下您的小赞赞,小弟会更加努力更新!!如果感兴趣的话,欢迎关注小弟公众号!!!🥳🥳🥳
因篇幅问题不能全部显示,请点此查看更多更全内容