我正在尝试使用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中每个记录一个文档相比,这种方法是否会占用大量磁盘空间(我不存储任何字段 )?
提前感谢您的回复,
答案 0 :(得分:0)
首先,请注意索引是如何设置的。每个术语的索引如下:
[术语] [文档ID] [文档ID] ...
其中[docid]是包含该术语的文档的ID。所以回答你的问题:
更重要的问题是查询无法正确地进行标注。例如,搜索找到在MATH和STATS中匹配的行#1,以及仅在MATH中匹配的行#2。您需要手动对第1行进行排名,因为Lucene不会知道这两个文档实际上是同一行。
简而言之:除非你有一些绝对庞大的索引,否则我不会担心存储/性能。但我会担心你将如何得分。