Lucene索引和搜索

时间:2010-07-15 15:44:24

标签: lucene

我正在尝试使用Lucene索引数据库中的表。我只使用Lucene进行索引,而不存储Fields。上面提到的表有五列(userid(PK),描述,报告编号,报告类型,报告)。

如果Lucene找到了匹配项,我打算使用userid,reportnumber和report type的组合来从数据库中获取数据。

表中的一条记录可以跨越多行,例如

JQ123,SOMEDESCRIPTION,1,FIN,fin报告的内容
JQ123,AnotherDescription,2,MATH,数学报告的内容
JQ123,YetAnotherDesc,3,MATH,另一个数学报告的内容
JD456,MoreDesc,1,STAT,统计报告的内容..so on

某些报告类型,例如(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
}           

1. 对同一记录使用不同的文档是否会以任何方式影响Lucene的搜索效率?
2. 与Lucene中每个记录一个文档相比,这种方法是否会占用大量磁盘空间(我不存储任何字段 )?

提前感谢您的回复,

1 个答案:

答案 0 :(得分:0)

首先,请注意索引是如何设置的。每个术语的索引如下:

[术语] [文档ID] [文档ID] ...

其中[docid]是包含该术语的文档的ID。所以回答你的问题:

  1. 例如MATH和STATS包含相同的术语,它们将在此处列出两次。因此搜索必须查看两个文档,理论上它应该只需要查看一个文档。但这是一个非常小的惩罚。
  2. 我假设你必须为每个文档至少存储一个ID,所以你会看到一个小的存储增加。它将是(id的长度)*(每行的文档数)。再次,这是微不足道的。
  3. 更重要的问题是查询无法正确地进行标注。例如,搜索找到在MATH和STATS中匹配的行#1,以及仅在MATH中匹配的行#2。您需要手动对第1行进行排名,因为Lucene不会知道这两个文档实际上是同一行。

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