SOLR查询过滤结果中的自定义排序?

Posted

技术标签:

【中文标题】SOLR查询过滤结果中的自定义排序?【英文标题】:SOLR Query for customized Sort in the Filtered result? 【发布时间】:2012-08-10 08:24:02 【问题描述】:

在 Solr 索引记录中,假设我有这个示例记录(例如 JSON):


    "title":"Innovation Life and Strategy",
    "author":"Sarah Howard",
,

    "title":"Simple Life", <--- This will be ignored
    "author":"W. David",
,

    "title":"Today's Innovations",
    "author":"Michael Wayne", <--- This Author will be listed at the top
,

    "title":"The Innovation Records",
    "author":"Tommy Wright",
,
etc ..

如何进行 Solr 查询:

title 字段中由 innovation 过滤(所以我们在那里有 3 条记录) 然后,对结果进行排序,将作者:Wayne 放在顶部

所以最终的结果应该是:


    "title":"Today's Innovations",
    "author":"Michael Wayne",
,

    "title":"Innovation Life and Strategy",
    "author":"Sarah Howard",
,

    "title":"The Innovation Records",
    "author":"Tommy Chen",
,

我只迈出了第一步,fq=title:*Innovation* 但我不知道第二步的查询(自定义排序)。 请问怎么弄啊?

【问题讨论】:

自定义排序的依据、逻辑或规则是什么??有没有固定的逻辑??? 我的意思是你的自定义排序背后的逻辑是什么?因为在这种情况下焦点似乎很明显,但在其他情况下会有所不同。您可以提高韦恩的结果,这将导致它始终出现。但是,如果没有任何规则集,这是没有意义的,也不是通用的。 提升?你的意思是我们可以使用Boost设置显示顺序优先级?你能举一些例子吗? 如果您使用 dismax 查询处理程序,您可以轻松提升 bq=author:wayne^1.5 等记录。这将增加作者拥有韦恩的记录。但是,这太具体了,不是通用的规则。 【参考方案1】:

您可以使用字段提升而不是排序。详情请查看http://wiki.apache.org/solr/SolrRelevancyFAQ。

你可能需要这样的东西:

q=title:*&bq=author:Wayne^10&fq=title:*Innovation*

这会生成标题中包含“创新”的所有文档,匹配“Wayne”的文档得分更高。

确保使用 WhitespaceTokenizer(而不是 KeywordTokenizer)对“作者”进行索引,否则您将无法使用分隔词进行搜索(请参阅 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters)。

【讨论】:

【参考方案2】:

在这种情况下,我认为这是不可能的,因为作者是一个多值字段,因为有两个值:名字和姓氏。 因此,如果您想按姓氏排序,则必须将此字段拆分为 2 个字段: author_first_name, author_surname

您可以在索引时间拆分名称,例如使用数据导入处理程序。

另一种解决方案是在 java 中编写自己的排序算法。

关键(在每种情况下)是要找到确定的名字是什么,因为并非每个名字都只包含两个名字,例如Docotor Tommy Chenkim jong il - 也存在由两个名字组成的姓氏(尤其是在亚洲)。

我认为这是真正的问题。

【讨论】:

嗯.. 至少,在过滤后,您将如何对单值字段进行排序? fq=title:*Innovation*&sort=author desc 看看这个:wiki.apache.org/solr/CommonQueryParameters#sort 不,没有将wayne 放在顶部的展示位置排序。只是简单的 A~Z 顺序。 顺便说一下,如果我查看您的示例,如果词干提取处于活动状态,fq=title:*Innovation* 将返回与 fq=title:Innovation 相同的结果 solr 以作者为一串。所以它不知道“wayne”,但它知道“Michael Wayne”。使用我的示例,您使用的是降序排序,这意味着“最高”字母在前……取决于作者姓名的第一个字符。在这种情况下,“M”。但是看看你的例子“M”是“最小”的字符。此示例将创建以下顺序:“Tommy Chen” -> “Sarah Howard” -> “Michael Wayne” ... 取决于(第一个字符的)T->S->M 的降序字母顺序。您可以使用&amp;sort=author asc更改订单

以上是关于SOLR查询过滤结果中的自定义排序?的主要内容,如果未能解决你的问题,请参考以下文章

java实现多表的自定义查询。

mvc(QSortFilterProxyModel)中的自定义排序仅适用一次

SQL Server 中的自定义排序

PHP 带有排序选项的WordPress的自定义分类法过帐列表过滤器

基于列表显示中的自定义可调用在 Django Admin 中排序

NSFetchedResultsController 中的自定义排序