Solr嵌套文档与分组/字段崩溃(通过Django Haystack)

时间:2017-12-07 23:47:54

标签: python django solr

我正在一个网站上工作,该网站在搜索后端时使用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,因为我们只在Solr中的App Foo文档中存储版本A的元数据。

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

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

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

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

最后,我是否需要撕掉Haystack并使用与Solr不同的界面?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您可以将原始参数添加到solr查询中,我认为最好的选项是结果在solr中折叠,一旦您将所有版本编入索引,就可以通过app字段折叠,因此它只会返回一个结果。然后,您可以通知崩溃解析器您想要最新的解析器。

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

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