Lucene索引時字段可以設置爲存儲(Store.YES)或者不存儲(Store.NO)。一般情況下,搜索完成之後會得到一個TopDocs對象,用它去獲取ScoreDoc之後取出Document。使用Document獲取存儲在索引中的值。但有些排序字段是不存儲的,在構造Document時使用的下面的方式:
doc.add(new Field("time", "2001", Store.NO, Index.NOT_ANALYZED_NO_NORMS));
這樣在獲取Document之後,並無法獲取time字段的值。難道真無辦法了?
仔細分析一下,Lucene是怎麼排序的就知道time這個字段肯定會在索引中存至少一份的,不然一個文檔的time怎麼和另外一個文檔的time去比較?
下面的代碼解決了這個問題:
首先獲取一個TopFieldDocs,之後用它獲取ScoreDoc,而此時的ScoreDoc其實是FieldDoc的實例。強制把ScoreDoc轉爲FieldDoc之後獲取FieldDoc的fields字段。這個字段是一個數組,裏面存儲了你在請求排序是傳入的所有字段的值,並且按照傳入的順序進行保存。
上面代碼中searchWithOneSortField、searchWithTwoSortField兩個方法分別演示了在一個排序條件下和兩個排序條件下的使用效果。