【问题标题】:Solr nested documents vs. grouping/field collapse (via Django Haystack)Solr 嵌套文档与分组/字段折叠(通过 Django Haystack)
【发布时间】:2023-06-21 00:44:01
【问题描述】:

我正在开发一个使用 Solr 运行 Django 作为搜索后端的网站。 Haystack 用作 Django 到 Solr 的接口。我目前有一个 Solr 集合,Apps。每个应用程序都有多个版本,但在 Solr 中,它们表现为每个应用程序一个(最新)版本。我遇到了该架构的限制:我需要能够搜索应用的所有版本并返回最相关的版本。

Django ORM 中的示例数据:

App Foo

  • A 版 - 2017 年 11 月发布,与 Linux 兼容
  • 版本 B - 2017 年 4 月发布,与 Windows 兼容

Solr 中的示例搜索:提供与 Windows 兼容的版本的所有应用

预期:返回 App Foo。

实际: App Foo 没有返回,因为我们只将 Release A 的元数据存储在 Solr 中的 App Foo 文档中。

我正在追求的一个解决方案是基于 Release 而不是 App 来索引 Solr。但是当我们这样做时,我们如何使用 Solr/Haystack 只返回与查询匹配的最新版本?

结果分组/字段折叠似乎可以解决问题:http://yonik.com/solr-result-grouping-field-collapsing/ 根据一个字段中的匹配属性对结果进行分组,返回前 N 个结果听起来很正确。但是 Haystack 支持吗?如果没有,有没有办法把它硬塞进去?

另一种解决方案可能是使用 Solr 嵌套文档:http://yonik.com/solr-nested-objects/ Releases 确实是 Apps 的子级。 但同样,我发现 Haystack 不支持此功能。此外,嵌套对象的语法......很疯狂。

解决此问题的最佳做法是什么?结果分组或嵌套对象?两者有什么区别?为什么要使用一个而不是另一个?

最后,我是否将不得不淘汰 Haystack 并使用与 Solr 不同的界面?

提前致谢!

【问题讨论】:

    标签: python django solr


    【解决方案1】:

    如果你可以在你的 solr 查询中添加原始参数,我认为最好的选择是在 solr 中折叠结果,一旦你索引了所有版本,你可以按应用字段折叠,所以它只会返回一个结果。然后,您可以通知折叠解析器您想要最新的解析器。

    fq={!collapse field=app max=timestamp_field}
    

    响应格式相同,因此您不必在响应解析中修改任何内容。

    【讨论】: