代码之家  ›  专栏  ›  技术社区  ›  Grundlefleck anujkk

Lucene可以从一个索引文件返回几个搜索结果吗?

  •  8
  • Grundlefleck anujkk  · 技术社区  · 16 年前

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

    我想知道Lucene是否可以为这些非常大的文档编制索引,并在它们上面创建一个抽象,从而提供更细粒度的结果。

    举个例子也许能更好地解释我的意思。考虑一本非常大的书,比如《圣经》。一个文件包含了圣经的整个文本,所以在演示中,搜索结果会显示“大马士革”指向该文件。我想做的是保留大文档,但是搜索会返回指向一本书、一章甚至与一首诗一样精确的结果。因此,搜索“大马士革”可以返回第23卷第7章第8节。

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

    如果它有任何不同,我使用Java Lucene 2.90和AM索引HTML文件的大小大约为1MB -4MB。它在文件大小方面不是很大,但相对于一个阅读它的人来说是很大的。


    我想我没有尽我所能解释清楚。下面是另一个例子。

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

    我不想为学期提供不同的文件结果。所以如果大马士革这个词在一个特定的 <DIV & GT; 只有一场比赛。

    它出现在来自的评论中 Kragen 我想做的就是在Lucene进入索引阶段时解析HTML。然后,我可以根据解析器所读取的内容,将要考虑的块确定为一个文档。所以,如果我看到一个带有某个类的DIV,我可以开始一个新的Lucene文档,当在DIV内容中搜索一个单词时,它将作为一个单独的命中返回。

    这听上去像我想做的,有可能吗?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Justin    16 年前

    是的-Lucene在一个文件中记录匹配项的偏移量,这样可以用来确定在索引内容中需要查找匹配项的位置。

    有一个Lucene。突出显示为您完成这项确切任务的附加组件-尝试 this article 关于stackoverflow还有几个关于点击突出显示的问题(其中许多问题是为与web应用程序一起使用而定制的,因此也可以做一些类似于周围匹配单词的事情 <b> 标签)

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

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

    最后,很明显,用户在索引中的每个匹配文档都会收到一个点击-如果你想向用户展示一个匹配书籍的列表,那么很明显是逐本索引,但是你可能会发现向用户展示一个匹配章节的列表更为合适,在这种情况下,显然是逐章索引。

        2
  •  0
  •   Yuval F    16 年前

    一种方法是用一本书创建多个文档。这些文件可以代表书籍、章节或诗歌。因为文本不需要是唯一的,所以我会这样做。 这样,创世记第一章的第一节经文将被索引四次:在整个圣经中,在创世记的第一章经文中,作为经文。

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

    推荐文章