按更多列对SharePoint搜索结果进行排序

时间:2020-03-06 14:20:53  来源:igfitidea点击:

我在SharePoint 2007(MOSS)中使用FullTextSqlQuery,需要按两列对结果进行排序:

SELECT WorkId FROM SCOPE() ORDER BY Author ASC, Rank DESC

但是,在返回结果时,似乎仅考虑了ORDER BY的第一列。在这种情况下,结果按作者正确排序,但不按等级排序。如果我更改顺序,则结果将按等级排序,但不按作者排序。

我不得不求助于我自己的排序结果,我不太喜欢这种排序方式。有没有人解决这个问题?

编辑:不幸的是,它也不接受ORDER BY子句中的表达式(SharePoint引发异常)。我的猜测是,即使查询看起来像合法的SQL,也会在将其提供给SQL Server之前以某种方式进行解析。

我试图用SQL事件探查器捕获查询,但无济于事。

编辑2:最后,我使用单列排序(在本例中为Author,因为这是最重要的),并在结果的前N个代码中进行了第二次排序。对于该项目来说效果很好,但是给人一种混乱的代码感觉。

解决方案

我没有SharePoint的经验,但是如果只接受一个ORDER BY子句,我会将其更改为表达式而不是列。假设"排名"是一个数字列,最大值为10,则可能会起作用:

SELECT WorkId FROM SCOPE() ORDER BY AUTHOR + (10 - Rank) ASC

等级是MOSS FullTextSqlQuery中的特殊列,它为每个结果的等级提供数值。对于每个查询,该值将有所不同,并且相对于该特定查询的其他结果而言。由于该排名对于每个结果都应具有唯一的值,因此按排名排序,然后作者将与按排名排序相同。我会尝试在另一列而不是排名上进行排序,以查看结果是否如预期的那样返回,如果这样,麻烦可能与MOSS对结果进行排名的方式有关,这将因每个唯一查询而异。

我们也说对了,查询看起来像SQL,但这不是实际传递给SQL服务器的查询,它是特殊的Microsoft Enterprise Search SQL查询语法。

我也遇到了FullTextSqlQuery和MOSS 2007的相同问题,其中只考虑了多列" ORDER BY"中的第一列。

我在用于SharePoint搜索的MSDN论坛中输入了此主题,但是没有收到任何答复:

http://social.msdn.microsoft.com/Forums/zh-CN/sharepointsearch/thread/489b4f29-4155-4c3b-b493-b2fad687ee56

Microsoft最终发布了有关此问题的知识库文章。

"在SharePoint搜索查询的ORDER BY子句中使用RANK时,不应使用其他属性"

http://support.microsoft.com/kb/970830

症状:在SharePoint搜索查询的ORDER BY子句中使用RANK时,结果中仅使用第一个ORDER BY列。

原因:RANK是一种特殊属性,在全文索引中排名,因此不能与其他托管属性一起使用。

解决方法:不要将多个属性与RANK属性一起使用。