开发环境

  • 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索引库中,进行日期范围内的查找时,就要按照这样的格式进行格式化.

java查询的时间返回为时间戳 注解_字段

日期范围内查找的实际应用

当时已有如下的solrquerstring进行检索

(((title_2:市)) OR (((DOCS_2:市) OR (CON_ADD_2:市))) OR ((attachment_name:市)))

java查询的时间返回为时间戳 注解_字段_02


在上面的搜索的基础上,加上日期范围的条件

代码如下, 就是在原有的查询条件的外面,拼接一个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(")");