5

我只是想知道我们是否可以在 lucene 中实现一些 RDBMS 功能。

示例: 1) 我有 10,000 个项目文档(pdf 文件),必须对其内容进行索引,以使它们可供搜索。2)每个文件都与一个项目有关。项目可以包含项目名称、编号、开始日期、结束日期、位置、类型等详细信息。

我必须在 pdf 文件的内容中搜索给定的关键字,但是在显示结果时,我想显示第 (2) 点中提到的项目元数据。

我的想法是在索引时将一个名为 projectId 的字段与每个 pdf 文件相关联。一旦我们得到它,我们将再次触发搜索以获取项目元数据。

这样我们可以避免重复数据。此外,如果我们想更新项目元数据,我们最终将只在一个地方进行更新。否则,如果我们将此元数据与所有 pdf 文档索引一起存储,我们最终将更新所有文档,这不是我想要的方式。

请指教。

4

5 回答 5

1

如果我理解正确,您有两个问题:

  1. 我可以在 Lucene 中存储一个项目 id 并将其用于进一步搜索吗?是的你可以。这是一种常见的做法。
  2. 我可以使用这个项目 id 来搜索 Lucene 的项目元数据吗?是的你可以。我不知道这是否是个好主意。这取决于您的元数据更新频率和您的访问模式。如果元数据是相对静态的,并且你只能通过 id 访问它,Lucene 可能是一个存储它的好地方。否则,您可以使用项目 ID 作为数据库表的主键,这可能更合适。
于 2009-05-06T12:28:27.883 回答
1

你可以这样使用 Lucene;

优点:

全文搜索很容易实现,而在 RDBMS 中则不然。

缺点:

参照完整性:您可以在 RDBMS 中免费获得它,但在 Lucene 中,您必须自己实现它。

于 2009-08-28T20:31:33.383 回答
1

听起来是一件非常好的事情。您将拥有的唯一限制(通过在 Lucene 中存储对项目的引用而不是项目数据本身)是您将无法同时查询文档文本和项目元数据。例如, "documentText:foo OR projectName:bar" 。如果您没有这样的要求,那么似乎将 ID 存储在引用数据库行的 Lucene 中是一件好事。

于 2009-05-08T16:00:00.033 回答
1

我不确定您的整体设置,但也许Hibernate Search适合您。它将允许您将关系数据库的优势与 Lucene 等全文搜索引擎的强大功能相结合。元数据可能与原始 pdf 文档一起存在于数据库中,而 Lucene 文档仅包含可搜索的数据。

于 2009-06-16T14:33:59.537 回答
1

这绝对是可能的。但请始终注意,您正在将 Lucene 用于不打算用于的目的。一般来说,Lucene 是为全文搜索而设计的,而不是为映射关系内容而设计的。因此,您的系统越复杂,您的关系内容就越会降低性能。

特别是,有几个领域需要密切关注:

  • 将每个字段的值存储在索引中会降低性能。如果您不太在意亚秒级搜索结果,或者您的索引相对较小,那么这可能不是问题。
  • 此外,请注意,如果您没有使用默认排名算法,并且您的自定义算法需要有关项目的信息来计算每个文档的分数,这也会对搜索性能产生巨大影响。

如果您需要为关系内容设计的更强大的索引,那么有值得研究的分层索引工具(由 Apache 开发,称为Jackrabbit的工具)。

随着您的项目不断增长,您还可以查看同样由 Apache 开发的Solr,它提供了一些附加功能,例如多面搜索。

于 2009-08-26T03:06:17.577 回答