【问题标题】:Lucene Indexing and searchingLucene 索引和搜索
【发布时间】:2010-07-15 15:44:23
【问题描述】:

我正在尝试使用 Lucene 为数据库中的表建立索引。我使用 Lucene 仅用于索引,不存储字段。上面提到的表格有五列(userid (PK)、description、report number、reporttype、report)。

如果 Lucene 发现命中,我打算使用用户 ID、报告编号和报告类型的组合从数据库中取回数据。

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

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

一些报告类型,例如(数学)具有高度结构化的内容(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 中的每条记录有一个文档相比(我不存储任何字段)?

提前感谢您的回复,

【问题讨论】:

    标签: lucene


    【解决方案1】:

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

    [术语][docid][docid]...

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

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

    一个更重要的问题是查询不能被适当地规范化。例如,搜索查找在 MATH 和 STATS 中匹配的第 1 行,以及仅在 MATH 中匹配的第 2 行。您需要手动将第 1 行排名更高,因为 Lucene 不会知道这两个文档实际上是同一行。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多