lucene默認根據匹配度對搜索結果降序排,如果對某個域進行排序?
通常分兩步:
step1)建索引時
doc.add(new Field("audittime", row.get("audittime").toString(),
Field.Store.NO, Field.Index.UN_TOKENIZED));
關鍵點是你需要排序的字段建索引時應該采用Field.Index.UN_TOKENIZED,至于需不需要Field.Store.NO看實際情況,反正不影響排序
step2)搜索時
public Hits search(SearchVO searchVO) throws IOException {
................
Sort sort = this.buildSort(searchVO);
Hits hits = searcher.search(query, sort);
return hits;
}
private Sort buildSort(SearchVO searchVO) {
if (searchVO.getOrderby() == null || searchVO.getOrderby().length() < 1) {
return null;
}
Sort sort = new Sort(searchVO.getOrderby(),
(searchVO.getAscflag() == 1 ? false : true));
return sort;
}
關鍵點是通過建立一個Sort實例然后傳給IndexSearcher 的另一個重載方法search(Query query,Sort sort);
通過Sort你可以指定排序字段名,升序降序.
如果你需要特指字段類型,你需要使用 new Sort(SortField field)
或者你需要通過多字段排序,你需要使用 new Sort(SortField[] fields)
我就不再贅述了
題外話:
使用lucene 排序是很簡單的,但如何發揮它的效果是一個值得思考的地方.
如果你是實時的更新lucene索引我沒話說(這需要相當謹慎的設計).
如果你定時更新索引,就會有些問題,比如你要排序的字段更新速度很快,你應該如何顯示它? 因為你排序的數據(即建索引時的數據)和當前的數據并不完全同步,這會給顯示帶來問題.如果你顯示建索引時的數據,這樣排序本身沒問題,但客戶會很奇怪我的數據明明是6了怎么還顯示4.如果你顯示當前的數據就更奇怪了,客戶可能會奇怪我的數據是1000怎么排名第4,排名第一的才500? 如果你的數據更新緩慢,這樣做不會有什么問題.但更新很快的話就是災難了.