如何为一对多关系配置Solr

Geo*_*ell 5 search solr flatten

我正在开发使用Solr的搜索应用程序,该应用程序需要搜索分成几章的“书”。一本书可能看起来像这样:

title: "book title"
author: "mr whoever"
chapters: [
    {
        title: "some chapter title"
        text: "blah blah blah"
    },
    {
        title: "some other title"
        text: "blah blah blah"
    },
    ... etc.
]
Run Code Online (Sandbox Code Playgroud)

搜索要求:

  • 用户搜索的是书籍,而不是章节,因此,给定所有章节文本,顶部的结果必须是总体上最相关的书籍。

  • 用户需要查看一本书中哪些章节已匹配,有关这些章节的信息以及每个章节进行了多少匹配。

结果样机


进展:

多值字段

Solr支持多值字段(即每本书多个章节),但是在书本文档上每个字段不可能有两个字段(标题和文本)。

Solr“加入”

我不知道这是否有必要。每章仅归一本书所有,因此似乎我们可以将它们全部放入一个文档中,而无需过多重复。

动态场

例如,具有诸如“ chapter1text_txt”,“ chapter1title_txt”和“ chapter2text_txt”的字段,并且仅结合每章的信息独立于solr,因此solr不知道“ chapter1text_txt”,“ chapter1title_txt”是同一事物的一部分。

配置schema.xml以支持和搜索此类文档的正确方法是什么?

Geo*_*ell 1

文件结构

到目前为止,最好的解决方案是对chapter_title和 都使用多值字段chapter_text,并在上传文档中强制执行这些值的一致排序,因此第一个chapter_title始终对应于第一个chapter_text,依此类推。

这是 schema.xml 的部分:

<field name="report_title"
       type="text_en" indexed="true" stored="true"/>

<field name="chapter_title"
       type="text_en" indexed="true" stored="true" multiValued="true"/>

<field name="chapter_text"
       type="text_en" indexed="true" stored="true" multiValued="true"/>
Run Code Online (Sandbox Code Playgroud)

这是一个折衷方案,因为索引无法知道chapter_title和之间的这种关系chapter_text,因此不可能要求“标题中包含X且正文中包含Y的章节”。

比赛计数

我仍然没有找到一种方法来做到这一点,但我正在考虑在要求覆盖整个文档的一个大片段后使用突出显示并计算突出显示术语的数量。