用于对书籍、章节和页面进行建模的 SOLR 架构



我们必须索引书籍,每本书被分成章节,章节被分成几页(页面代表印刷版的原始页面切割)。

我们应该显示按书籍和章节(对于同一本书)和页面(对于同一章节)分组的结果。

据我所知,我们有两种选择:

  1. 索引页作为 SOLR 文档。通过这种方式,理论上我们可以检索章节(和书籍? 使用分组,但:

    • 我们将错过两个连续页面的匹配(页面剪切只是由于印刷需求,因此概念可以拆分......如印刷书籍)

    • 我不知道是否可以在 SOLR 中将结果分组到两个不同的级别(书籍和章节)

  2. 索引章节作为 SOLR 文档。在这种情况下,我们将拥有正确的匹配项,但是例如,如何获取包含匹配项(或部分匹配项)的页面列表?(我们需要页面,因为客户端只能显示页面)

我一直可以选择

使每个页面成为Solr文档。

当我解析一本书的数字版本时,我会捕获有关哪些页码属于给定章节的信息,计算出该章节的长度,并为每个章节分配某种 ID。由于每一页都成为Solr文档,因此必须为每个页面的清单重复该信息,其中还包括整体书籍元数据,如标题,创建者,出版日期等。这些都不是在Solr本身中完成的,而是在Solr索引之前使用shell脚本作为准备。有时我将所有元数据存储在数据库中,有时存储在磁盘上的文件中。最后,我在Solr中添加/更新XML中每页生成一个清单,以便Solr易于摄取。

当我查询Solr时,我使用fq={!collapse field=<chapter-id-field> nullPolicy=expand}以便在搜索结果中,只有章节中最相关的页面返回以呈现给用户。nullPolicy=expand属性允许不是书籍章节的搜索结果正常返回,而不会折叠,这在我整理由各种来源组成的搜索索引时很重要。

从用户的角度来看,他们得到一个"章节"点击,并且该章节只会在他们的搜索结果中出现一次。在结果 UI 中,我明确表示"本章有 x 页长,在 y 页上找到了最适合您搜索的"。UI 包含一个文档查看器,因此我让用户可以选择直接跳转到文档查看器中的第 y 页(最相关),或者从章节的开头开始阅读。当然,我也可以让他们选择从头开始阅读整本书。

至于担心跨页面拆分的概念,我不担心。我发现大多数人搜索单个单词或小短语。我敢肯定,在某些情况下,一个搜索短语拆分到两个Solr文档中,但我们在这里谈论的是书籍:大量内容,其中关键术语和短语倾向于重复。

最新更新