Lucene索引和搜索

问题描述:

我想索引使用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的每一个记录文档时(我不存储任何领域)这种方法有超过头任何显著的磁盘空间?

在此先感谢您的回复,

首先,请注意如何设置索引。每学期的指数看起来像:

[长期] [文档ID] [文档ID] ...

其中发现的[文档ID]的是其中包含该项目文件的ID。因此回答你的问题:

  1. 如果例如MATH和STATS包含相同的术语,它们将在此处列出两次。因此,搜索将不得不看两个文件,理论上它只需要看一个。但这是一个非常小的惩罚。
  2. 我假设您必须为每个文档至少存储一个ID,因此您会看到次要存储增加。它将是(id的长度)*(每行文件的数量)。再次,这是微不足道的。

更重要的问题是查询无法正确规范。例如,搜索查找在MATH和STATS中匹配的行#1和仅在MATH中匹配的行#2。您需要手动排列第1行,因为Lucene不会知道这两个文档实际上是同一行。

简而言之:除非你有一些绝对庞大的索引,否则我不会太在意存储/性能。但我担心你将如何评分该查询。