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 Chen
或kim 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 的降序字母顺序。您可以使用&sort=author asc
更改订单以上是关于SOLR查询过滤结果中的自定义排序?的主要内容,如果未能解决你的问题,请参考以下文章
mvc(QSortFilterProxyModel)中的自定义排序仅适用一次
PHP 带有排序选项的WordPress的自定义分类法过帐列表过滤器