轉載請注明出處: http://blog.csdn.net/xiaojimanman/article/details/43052829
前面我們介紹了Analyzer和Query,這篇我們就開始該系列最後一個類IndexSearcher的搜尋API介紹,Lucene中重點API不止這裡介紹的這一點,還有IndexWriter、Field、Highlighter等,這些就不在這一部分做介紹了,如若案例中用到的話,再做簡單介紹。
檢視Lucene4.3.1中IndexSearcher的API請 點選這裡,關于搜尋的方法如下圖:

從上圖幾個方法可以看出,有幾個重點類需要介紹下:Query(上篇部落格已介紹)、Filter、Sort、ScoreDoc、Collector
Collector
Collector主要用來對搜尋結果做收集、自定義排序、過濾等,在Lucene4.3.1的API中,有兩個搜尋方法用到了Collector,但是其下面都有一句Lower-level search API(低級别的搜尋API),如果沒有非用不可的需求,盡量還是使用其他方法。
Filter
Filter主要是做篩選條件的,用于指定哪些文檔可以在搜尋結果中,這個自己使用的并不是太多,查詢了一些資料,介紹說有Filter的檢索過程是先對資料源做篩選預處理(Filter中指定的),然後将篩選的結果交給查詢語句,如果是這樣的話,使用Filter的代價将會很大,他的查詢耗時可能會提高數倍。個人認為也沒有必要使用Filter,如果真的需要對結果做篩選,可以把這些篩選條件合并到Query中,而沒有必要建立一個Filter對象。
Sort
Sort在檢索方法中指定排序方式,相當于資料庫中的order by,建立方式如Sort sort = new Sort(new SortField("time", Type.LONG, true)),這裡的SortField構造方法中的三個參數分别代表域名、域資料類型、排序方式(true降序/false升序),這裡的例子隻是按照一個域進行排序,如果多個域可以直接在構造方法中添加,如sort = new Sort(new SortField("time", Type.LONG, true), new SortField("star", Type.INT, false))。
ScoreDoc
從上圖方法中,searchAfter方法中使用到ScoreDoc,該方法主要用在分頁查詢中,當然也可以用search方法替代,但是有一種情況是無法替代的,比如查詢第一頁10條資料,但由于推廣或廣告等需求,需要在其中添加幾條(具體未知)其他記錄,但是前端隻能展示10條資料,這樣該頁的最後幾條資料就沒有辦法顯示,但在下一頁中又想顯示這幾條資料,這樣使用seach方法實作就有點困難,事例需求圖形描述如下:
searchAfter在實作上述的需求時,在取下一頁資料時,隻需要将上次查詢的最後一個ScoreDoc告訴它即可,它可以直接從該條資料開始查詢下一頁的資料。
檢索方法中涉及到的類也算介紹結束了,現在就将這些組裝起來,以最簡單的一個檢索方法為例search(Query query, int n),該方法實作的是檢索符合條件query的前N條文檔,這裡的排序采用的是預設的相關度排序;這樣方法中添加其他的對象,就完成了其對應的功能,如search(Query query, int n, Sort sort),該方法指定了其排序方式。這篇部落客要介紹IndexSearcher的搜尋相關API,是以這裡就不再寫測試demo了。
IndexWriter
原計劃第一部分到現在應該結束的,也不對其他内容做相關介紹的,但讀者的回報說索引的增删改的方法不是太清楚,那這裡就先簡單的題以下其方法,自己感興趣的可以先實作下,添加新文檔到索引中這個在 建立索引這篇部落格中已經提到,這裡就不再介紹。
修改索引
public boolean updateDocument(Term term, Document doc){
try {
indexWriter.updateDocument(term, doc);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
這裡的term指定了要修改的索引文檔,一般這裡使用索引中文檔的唯一辨別。
删除索引
public boolean deleteDocument(Query query){
try {
indexWriter.deleteDocuments(query);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
這裡的query指定了文檔需要滿足的條件,當然也有方法可以直接清空索引
public boolean deleteAll(){
try {
indexWriter.deleteAll();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
上述的這些操作,都需要執行indexWriter.commit()之後才會儲存,否則是不會有效的。
注:第一部分:lucene的基本原理以及API簡單接口的使用 到這裡就結束了,按照資料流向下一部分應該介紹資料采集的,但為了在介紹搜尋背景部分不忘記lucene的相關知識,這裡就把搜尋背景部分稍微提前一點。在開始搜尋背景部分之前,我也會在1-2篇部落格中,介紹一下這個案例的demo以及背景的系統架構,在對整個需求有一定的了解基礎之上,我們再開始案例開發。如若對個人的部落格在排版或者内容等方面有相關的意見,真心希望在評論中可以提及,我也會積極采納各位的建議,把這一個系列的部落格做好,大家共同進步。
ps:最近發現其他網站可能會對部落格轉載,上面并沒有源連結,如想檢視更多關于 基于lucene的案例開發 請 點選這裡。或通路網址http://blog.csdn.net/xiaojimanman/article/category/2841877