初學solr在schema 裏面配置並使用sorl的date或者tdate類型,具體類型與使用以下:
<field name="tdate_field"type="tdate"indexed="true"stored="true"/>
<field name="date_field"type="date"indexed="true"stored="true"/>
<fieldType name="date"class="solr.TrieDateField"precisionStep="0"positionIncrementGap="0"/
<!-- A Trie based date field for faster date range queries and date faceting. -->
<fieldType name="tdate"class="solr.TrieDateField"precisionStep="6"positionIncrementGap="0"/>
在solr的web界面上進行query操做時,返回xml與json的時間結果老是相差8小時。可是sorj返回的獲得的java.util.Date數據值又是正確的,沒有相差8小時。
找到solr-crore包的
org.apache.solr.schema.
DateField代碼:
public static TimeZone UTC = TimeZone. getTimeZone("UTC");
發現默認的時區是UTC。可見solr存的時間值是對的,只不過顯示的時間是以"UTC"零時區的時間顯示,因此返回給Date數據也是正確的。
能夠說,這是solr的一個坑,solr不提供時區配置的方式,只以" yyyy-MM-dd'T'HH:mm:ss'Z'"的時間格式返回xml或json的字符串,同時solr經過http傳輸,查詢參數以字符串組裝(好像只能以字符串方式創建主查詢),例如:
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
String queryTime = QueryRule.ONLINE_TIME +":["+sdf.format(date )+"TO"+"*]";
query.setQuery(queryTime);
這樣作的話通常採用本機默認時區,天然就有8小時的相差。
能夠按以下方式解決:
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy -MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone. getTimeZone("UTC"));
String queryTime = QueryRule.ONLINE_TIME +":["+sdf.format(date )+"TO"+"*]";
query.setQuery(queryTime);
可是還有一點仍是很彆扭,solr在網頁,還有xml,json上返回的時間,仍是以UTC爲時區,相差8小時。
扯了半天,你可能早就想到了,用啥Date類型,乾脆用long存得了。