Lucene可以从单个索引文件中返回多个搜索结果吗?

时间:2009-11-18 11:11:25

标签: 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。然后我可以根据解析器读入的内容来决定我想要考虑的块作为一个文档。因此,如果我看到一个具有某个类的div,我可以开始一个新的Lucene文档,当搜索div内容中的一个单词时,它将作为单独的命中返回。

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

2 个答案:

答案 0 :(得分:1)

是 - Lucene记录了文件中匹配术语的偏移量,因此可以用来确定索引内容中需要查找匹配项的位置。

有一个Lucene.Highlight附加组件可以为您完成这项任务 - 尝试this article,StackOverflow上还有一些关于点击突出显示的问题(其中许多是针对网络应用程序使用而定制的)所以也做一些事情,比如用<b>标签围绕匹配的单词)

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

例如,假设用户搜索“foo”并且有2本书包含该术语。第一本书(书A)可能包含2章,每章都有很多引用“foo”的内容,但是本书的其余部分几乎没有提到这个术语,但是第二本书(书B)包含许多对“foo”的引用。然而,它们分散在整本书中。如果你按照书籍进行索引,那么你可能会发现书B是第一个命中,但是按章节索引你可能会发现书A的2章是前2个点击,接着是书B的章节。 / p>

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

答案 1 :(得分:0)

这样做的一种方法是从一本书中创建多个文档。这些文件可以代表书籍,章节或诗句。由于文本不必是唯一的,这就是我要做的。 这样,“创世记”第一章的第一节将被编入四次索引:整本圣经,创世记,第一章和诗句。

这里的一个微妙之处是检索的确切目标: 您是否只想在用户的上下文中显示搜索关键字?在这种情况下,请考虑使用Lucene highlighter。如果你需要进一步使用检索(即将检索到的指针带到一个章节或经文并在文本中对这个地方进行一些处理),我会按照之前描述的那样使用更细粒度的文档。