java - Lucene 能否从单个索引文件返回多个搜索结果?

标签 java html lucene indexing

我正在使用 Lucene 对少量大型文档进行索引和搜索。使用来自 Lucene 站点的演示,我已经为文档编制了索引并且能够搜索它们。但是,搜索结果并不是特别有用,因为它指向文档的文件。对于非常大的文档,这不是特别有用。

我想知道 Lucene 是否可以索引这些非常大的文档并在它们之上创建抽象以提供更细粒度的结果。

一个例子可能会更好地解释我的意思。考虑一本非常大的书,例如圣经。一个文件包含圣经的全部文本,因此在演示中,搜索“大马士革”的结果将指向该文件。我想做的是保留大文档,但搜索将返回指向书籍、章节甚至与诗歌一样精确的结果。因此,搜索“大马士革”可以返回(以及其他)第 23 卷第 7 章第 8 节。

这是否可能(以及 Lucene 使用中的最佳实践),还是我应该尝试将大文档分成许多小文件以进行索引?

如果有什么不同的话,我使用的是 Java Lucene 2.9.0,并且正在为大约 1MB - 4MB 大小的 HTML 文件编制索引。就文件大小而言,它并不大,但相对于阅读它的人来说却很大。


我认为我没有尽我所能解释这一点。再举一个例子。

假设我使用我的大型 HTML 文件,并且(为了论证)搜索词“大马士革”出现了 3 次。在 <div> 中的第 100 行标记,在 <p> 中的第 2000 行标记,并在 <h1> 中的第 5000 行标签。是否可以使用 Lucene 进行索引,这样会有 3 个结果,并且它们可以指向术语所在的特定元素?

我不想为该术语提供不同的文档结果。因此,如果“大马士革”一词在特定 <div> 中出现两次, 只会有一场比赛。

它出现在 Kragen 的评论中我想做的是在 Lucene 进行索引编制阶段时解析 HTML。然后我可以根据解析器读取的内容来决定我想将其视为一个文档的 block 。因此,如果我看到一个带有特定类的 div,我可以开始一个新的 Lucene 文档,当在 div 内容中搜索一个词时,它将作为一个单独的命中返回。

这听起来像我想做的吗,这可能吗?

最佳答案

是的 - Lucene 记录了文件中匹配项的偏移量,因此可用于确定您需要在索引内容中的何处查找匹配项。

有一个 Lucene.Highlight 插件可以为您完成这个任务 - 试试 this article , 在 StackOverflow 上也有几个关于命中突出显示的问题(其中许多是为与网络应用程序一起使用而定制的,所以也做一些事情,比如用 <b> 标签包围匹配词)

更新:根据您搜索索引的方式,您可能还会发现将大型文档拆分为较小的部分(例如章节)也是一个好主意 - 然而这更像是一个问题关于您希望如何组织结果、确定结果的优先级以及向最终用户展示结果。

例如,假设用户搜索“foo”并且有 2 本书包含该词。第一本书(A 书)可能包含 2 章,每一章都多次引用“foo”,但是本书的其余部分几乎没有提到该术语,但是第二本书(B 书)包含许多对“foo”的引用,但是它们散布在整本书中。如果你按书索引,那么你可能会发现 B 书是第一个命中,但是按章节索引你可能会发现 A 书中的 2 章是前 2 个命中,然后是 B 书中的章节。

最后,很明显,用户会为索引中的每个匹配文档显示 1 个匹配项 - 如果您想向用户显示匹配书籍列表,那么显然按书索引,但是您可能会发现它更适合向用户显示匹配章节列表,在这种情况下显然按章节索引。

关于java - Lucene 能否从单个索引文件返回多个搜索结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1755288/

相关文章:

php - 使用 Solr Lucene 索引不同类型的实体/对象

java - 将数据写入 JavaFX Tableview

java - 3D "free"相机的三角学

java - 文件名中有逗号时无法在资源管理器中打开文件

java - 从部署在 tomcat 服务器中的 JSP 打开共享本地文件夹(C 盘或 D 盘等)

java - Solr WordDelimiterFilter + Lucene 荧光笔

lucene - 使用 elasticsearch 对组中的最新文档进行聚合

java - 静态内部类的调用对象

javascript - 如何修复剪刀石头布蜥蜴 spock 程序的输出表?

html - Bootstrap : Buttons in a row with no gap between