2008-09-18 63 views
2
我使用的是FullTextSqlQuery在SharePoint 2007(MOSS),需要通过两列命令的结果

秩序的SharePoint搜索结果:由多个列

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

但是似乎从ORDER BY仅第一列在返回结果时要考虑到。在这种情况下,结果由作者正确排序,但不排序。如果我更改订单,结果将按Rank排序,但不会由作者排序。

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

编辑:不幸的是,它也不接受ORDER BY子句中的表达式(SharePoint引发异常)。我的猜测是,即使查询看起来像合法的SQL,它在被提供给SQL服务器之前也会被解析。

我试图用SQL Profiler来捕获查询,但无济于事。

编辑2:最后,我使用单列(作者在我的情况,因为它是最重要的)排序,并在结果的TOP N代码中做第二次排序。对于这个项目来说足够好,但是却留下了糟糕的代码感。

回答

2

微软最后发布了关于此问题的知识库文章。

“当ORDER使用RANK通过SharePoint搜索查询的WHERE子句,没有其他属性,应使用”

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

症状:当在ORDER使用RANK通过SharePoint搜索查询的WHERE子句结果中只使用第一个ORDER BY列。

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

解决方案:不要将多个属性与RANK属性结合使用。

0

我对SharePoint没有经验,但是如果是只有一个ORDER BY子句的情况下,我会将其更改为表达式而不是列。假设“等级”是具有10的最大值的数值列以下可能工作:

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

排名是在MOSS FullTextSqlQuery一个特殊的列得到的数值给每个结果的等级。该值对于每个查询将是不同的,并且对于该特定查询的其他结果是相对于。由于这个排名应该对每个结果都有一个独特的价值,并且按排名排序,那么作者就和按排名排序一样。我会尝试对另一列进行排序,而不是排名,以查看结果是否按照您的预期返回,如果是这样,您的问题可能与MOSS排名结果的方式有关,而每个独立查询的结果会有所不同。

另外你是对的,查询看起来像SQL,但它并不是实际传递给SQL服务器的查询,它是特殊的Microsoft企业级搜索SQL查询语法。