1. 程式人生 > >solrj日期範圍內查詢詳解

solrj日期範圍內查詢詳解

開發環境

  • solrj 5.4.0
  • solr 6.6.0

關於搜尋日期範圍

網上關於使用solrj進行日期範圍的查詢,搜得到最多的只有如下的文章
https://blog.csdn.net/awj3584/article/details/29001693
但是這篇文章只寫瞭如下的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(")");