【问题标题】:Solr boost query sort by whether result is boosted then by another fieldSolr 提升查询按结果是否被另一个字段提升排序
【发布时间】:2017-07-25 16:31:07
【问题描述】:

我正在使用 Solr 在我们的一个核心上运行查询。假设我的文档有两个字段:ID 和 Name。我还有一个单独的 ID 列表,我从数据库中获取并传递给查询以提升某些结果。

如果文档在查询中返回并且 ID 在列表中,则它会转到结果的顶部,如果它在查询中返回并且 ID 不在列表中,则它会低于那些在列表中。前者是来自“升压”。我的查询是这样的 - http://mysolrserver:8983/solr/MyCore/MyQueryHandler?q=Smith&start=0&rows=25&bq=Id%3a(36+OR+76+OR+90+OR+224+OR+391)

我可以让 boost 查询正常工作,但我需要提升结果按名称字母顺序排列,然后非提升结果也按名称字母顺序排列。我需要知道 &sort= 参数的用户。 &sort=score%20desc,Name+asc 不起作用。 我查看了很多文档,但我仍然不知道这是否可能。任何帮助表示赞赏。谢谢!

Solr 版本为 6.0.1。我实际上是在使用 SolrNet 与 Solr 交互,但如果我知道 url 的 &sort= 参数值需要是什么,我想我可以弄清楚 SolrNet 部分。

【问题讨论】:

    标签: sorting search solr lucene


    【解决方案1】:

    通过取消 boost 查询,我想通了。我使用“exists”函数添加了一个排序查询并将其传递给 ID 的子查询。存在返回一个布尔值进行排序,然后我将名称添加为第二个排序。它工作完美! 网址如下所示:

    http://mysolrserver:8983/solr/MyCore/MyQueryHandler?q=Smith&start=0&rows=25&sort=exists(query({!v=%27Id:(36+OR+76+OR+90+OR+224+OR+391)%27}))%20DESC,%20Name%20ASC
    

    【讨论】:

    • 使用标准查询解析器的注意解决方案。它甚至根据第二个排序字段对提升的记录进行排序。
    【解决方案2】:

    最符合您要求的是查询提升组件[1]。 在您的特定情况下,我将首先根据我的要求对我的 ID 进行排序(例如按名称排序),然后将它们维护在 elevate.xml 中。

    在查询时,您可以使用“forceElevation”参数强制提升,然后按名称对剩余结果进行排序。

    [1]https://cwiki.apache.org/confluence/display/solr/The+Query+Elevation+Component

    【讨论】:

    • 感谢您的回复,但无法创建文档,因为 ID 是动态的。
    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 2016-11-04
    • 2014-04-18
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多