2010-07-15 200 views
0

我想索引使用Lucene的數據庫中的表。我只使用Lucene索引,字段不存儲。上面提到的表格有五列(用戶標識符(ID),描述,報告編號,報告類型,報告)。Lucene索引和搜索

我打算使用userid,reportnumber和report類型的組合來從數據庫中獲取數據,如果Lucene發現命中的話。

表中的一條記錄可以跨越多行,例如,

JQ123,SOMEDESCRIPTION,1,FIN,鰭報告的內容
JQ123,AnotherDescription,2,MATH,數學報告的內容
JQ123,YetAnotherDesc,3,MATH,另一數學報告的內容
JD456,MoreDesc ,1,STAT,統計報告內容..等等

某些報告類型如(MATH)具有高度結構化的內容(XML,作爲字符串存儲在最後一列中),並且在將來我可能想要充實一些內容 作爲文檔的字段。

到目前爲止,我的策略是爲每一行創建一個Lucene文檔並對其進行索引。我的背後的想法是,1.這很容易,而且看起來合乎邏輯(對我來說) 2.如果我最終從某些文檔類型中提取內容並將它們放入字段中,所有需要的都是if語句檢查報告類型 並創建這些新字段。下面是相關代碼:

public void createDocument(){ 
Document luceneDocument=new Document(); 
luceneDocument.add(new Field("userid", userID, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("reportnumber", reportNum, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("reporttype", reportType, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("description", description, Field.Store.NO, Field.Index.ANALYZED)); 
luceneDocument.add(new Field("report", report, Field.Store.NO, Field.Index.ANALYZED)); 

if(reporttype.equalsIgnoreCase("MATH"){ 
luceneDocument.add(new Field("more fields", field content, Field.Store.NO, Field.Index.ANALYZED)); 
} 
indexwriter.add(luceneDocument) 
indexwriter.close 
}   

是否具有相同的記錄影響Lucene的搜索效率,以任何方式不同的文件?
2.會相比,具有Lucene的每一個記錄文檔時(我不存儲任何領域)這種方法有超過頭任何顯著的磁盤空間?

在此先感謝您的回覆,

回答

0

首先,請注意如何設置索引。每學期的指數看起來像:

[長期] [文檔ID] [文檔ID] ...

其中發現的[文檔ID]的是其中包含該項目文件的ID。因此回答你的問題:

  1. 如果例如MATH和STATS包含相同的術語,它們將在此處列出兩次。因此,搜索將不得不看兩個文件,理論上它只需要看一個。但這是一個非常小的懲罰。
  2. 我假設您必須爲每個文檔至少存儲一個ID,因此您會看到次要存儲增加。它將是(id的長度)*(每行文件的數量)。再次,這是微不足道的。

更重要的問題是查詢無法正確規範。例如,搜索查找在MATH和STATS中匹配的行#1和僅在MATH中匹配的行#2。您需要手動排列第1行,因爲Lucene不會知道這兩個文檔實際上是同一行。

簡而言之:除非你有一些絕對龐大的索引,否則我不會太在意存儲/性能。但我擔心你將如何評分該查詢。