如何为一对多关系配置 Solr

Posted

技术标签:

【中文标题】如何为一对多关系配置 Solr【英文标题】:How to configure Solr for one-to-many relationship 【发布时间】:2014-10-25 11:14:29 【问题描述】:

我正在使用 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.
]

搜索要求:

用户搜索的是 books 而不是 chapters,因此考虑到里面的所有章节文本,排名靠前的结果必须是总体上最相关的书籍。 p>

用户需要查看匹配书中的哪些章节、关于这些章节的信息以及每章匹配的数量。


进展:

多值字段

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

Solr“加入”

我不知道这是否有必要。每章只属于一本书,所以看起来我们可以将它们全部放在一个文档中而无需过多重复。

动态字段

例如具有“chapter1text_txt”、“chapter1title_txt”和“chapter2text_txt”等字段,并且仅连接独立于 solr 的每章信息,因此 solr 不知道“chapter1text_txt”、“chapter1title_txt”是相同的一部分东西。

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

【问题讨论】:

【参考方案1】:

文档结构

到目前为止,最好的解决方案是为 chapter_titlechapter_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"/>

这是一个折衷方案,因为索引无法知道chapter_titlechapter_text之间的这种关系,所以不可能要求“标题中带有XY的章节 在文本中”。

匹配计数

我仍然没有找到这样做的方法,但我正在考虑在要求一个覆盖整个文档的大型 sn-p 后使用突出显示和计算突出显示的术语的数量。

【讨论】:

以上是关于如何为一对多关系配置 Solr的主要内容,如果未能解决你的问题,请参考以下文章

如何为事实表创建一对多关系

Symfony:如何为与 Voryx REST Bundle 的一对多关系创建 POST 请求

Hibernate关联关系配置(一对多一对一和多对多)

核心数据:在一对多关系中匹配多个项目的组合

Zend 2 - 教义如何为三个实体插入一对多?

如何为多标签分类器/一对休息分类器腌制 sklearn 管道?