為了在沒(méi)有數據庫支持的情況下,完成多個(gè)屬性數據的檢索任務(wù),特地在代碼中加入了鼎鼎大名的Apache.Lucene。當然讓lucene來(lái)干這個(gè)是大材小用了一點(diǎn)。
Lucene的工作流程主要是:
1 使用IndexWriter,在指定的目錄建立索引的文件
2 將需要檢索的數據轉換位Document的Filed對象,然后將Document用IndexWriter添加倒索引的文件中
3 處理索引信息,關(guān)閉IndexWriter流
4 創(chuàng )建搜索的Query
5 給IndexSearcher指定索引文件的路徑后,用Query檢索后返回Hits對象作為結果
樣例代碼:
- //sample code,索引對象
- public class PersonInfo {
- public String firstName="";
- public String lastName="";
- public String IDNumber="";
- }
- //Lucene 的添加和更新索引
- public class LuceneSearcher {
- public void addPersionInfo(PersonInfo person) {
- Document doc = new Document();
- doc.add(Field.Keyword("FirstName",person.getFirstName()));
- doc.add(Field.Keyword("IDNumber",person.getIDNumber()));
- doc.add(Field.Keyword("LastName",person.getLastName()));
- doc.add(Field.Text("content",person.getIDNumber()));
- try{
- //刪除舊的相同的索引
- this.remove(person.getIDNumber());
- writer = new IndexWriter(directory, new StandardAnalyzer(), false);
- writer.addDocument(doc);
- writer.optimize();
- writer.close();
- }
- catch(IOException ioe) {
- ioe.printStackTrace();
- }
- }
- //刪除舊的索引,idNumber作為Person的PK,建立term后刪除
- public void remove(String idNumber) {
- try{
- IndexReader reader = IndexReader.open(directory);
- Term term = new Term("IDNumber",idNumber);
- reader.delete(term);
- reader.close();
- }
- catch(IOException ioe) {
- ioe.printStackTrace();
- }
- }
- //search 代碼片段
- public String[] search(String query) {
- //建立search對象
- Searcher searcher = new IndexSearcher(directory);
- //解析輸入的Query [FirstName: "gerald" AND LastName:"zhou" AND IDNumber:"10*"]
- Query query = QueryParser.parse(line, "FirstName", new StandardAnalyzer());
- Hits hits = searcher.search(query);
-
----------------------------------------------------------------------------------------
這樣就可以簡(jiǎn)單的用lucene來(lái)完成對person對象的firstName,lastName和IDNumber3個(gè)屬性的綜合查詢(xún)功能了,只要按照[url=
http://jakarta.apache.org/lucene/docs/queryparsersyntax.html]Lucene Query[/url]語(yǔ)法就可以了
需要注意的還有以下幾點(diǎn)
1 IndexWriter在添加新的document后,需要重新建立Index,則需要調用writer.optimize();方法
2 Lucene沒(méi)有update索引的方法,需要刪除后重新建立,參考remove方法
3 用IndexReader刪除Document后,需要重新用IndexWriter進(jìn)行整理,否則無(wú)法在進(jìn)行搜索(不知道是不是我設置問(wèn)題)
休息!休息,今天就到這里了??!
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。