solrj日期範圍內查詢詳解
阿新 • • 發佈:2019-01-06
開發環境
- 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(")");