开发环境
- solrj 5.4.0
- solr 6.6.0
关于搜索日期范围
网上关于使用solrj进行日期范围的查询,搜得到最多的只有如下的文章
但是这篇文章只写了如下的2行代码, 其他啥也没写.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
String time = "lostTime:["+sdf.format(new Date())+" TO "+sdf.format(new Date())+"]";
看到这两行代码,我是一脸懵逼. 不知道用来干嘛的.
之后琢磨了一下明白了
- 字符串time就是用来查询的时间范围条件
- lostTime 对应的是在solrhome中建立的要查询的日期的域fied的字段的名称
如下图所示. 这篇博主对应的字段是lostTime,而我对应的字段是upatetime或者是updatetimedate
一个是string类型,一个是date类型. 经过测试,这两种类型,都能进行时间范围内的查询. - 接着lostTime后面的,传递的第一个日期为查询的日期的起点
- 第二个日期为查询的日期的终点. 例如第一个日期传递的是三天前,第二个日期传递的是今天.那么查询的时间范围就是从三天前到今天的. 注意第一个日期的值,一定要小于第二个日期的值.
为何使用yyyy-MM-dd’T’HH:mm:ss’Z’进行日期的格式化
在updatetimedate字段,我有设置type=“date”,在solr中进行查询时,显示的值如下图
可以看到,solr对于日期的类型,就是按照这样的格式进行存储的.
因此在solr索引库中,进行日期范围内的查找时,就要按照这样的格式进行格式化.
日期范围内查找的实际应用
当时已有如下的solrquerstring进行检索
(((title_2:市)) OR (((DOCS_2:市) OR (CON_ADD_2:市))) OR ((attachment_name:市)))
在上面的搜索的基础上,加上日期范围的条件
代码如下, 就是在原有的查询条件的外面,拼接一个and. 加一个括号, 把日期的范围条件加进去
(((title_2:市)) OR (((DOCS_2:市) OR (CON_ADD_2:市))) OR ((attachment_name:市)))
AND (updatetimedate:[2019-01-01T15:17:59Z TO 2019-01-03T15:17:59Z])
在java代码中的运用如下. 根据传递进来的条件,查询一天的,一周的,一个月的日期范围.
String timeLimit="";
StringBuilder solrQueryString = new StringBuilder("");
Calendar calendar = Calendar.getInstance();
if ("oneday".equals(timeLimit)) {
// 一天内
calendar.add(Calendar.DAY_OF_YEAR, -1);
} else if ("oneweek".equals(timeLimit)) {
//一周内
calendar.add(Calendar.WEEK_OF_MONTH, -1);
} else if ("onemonth".equals(timeLimit)) {
// 一月内
calendar.add(Calendar.MONTH, -1);
}
Date pastDay = calendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
String time = "updatetimedate:["+sdf.format(pastDay)+" TO "+sdf.format(new Date())+"]";
solrQueryString.append(" AND ").append("(").append(time).append(")");