排名和排序 (FAST Search Server 2010 for SharePoint)

了解如何对 FAST Search Server 2010 for SharePoint 的查询结果进行排序。

上次修改时间: 2015年3月9日

可以指定如何按以下四种方式对 FAST Search Server 2010 for SharePoint 的查询结果进行排序:

本文内容
如何在查询请求中指定排序
按排名对搜索结果进行排序
按托管属性值对搜索结果进行排序
按公式表达式对搜索结果进行排序
按随机排序对搜索结果进行排序

  • 按排名排序   使您能够按相关性(排名)对查询结果进行排序。

  • 按托管属性排序   使您能够基于一个或多个托管属性的值对查询结果进行排序。

  • 按公式排序   使您能够按查询请求中指定的公式对查询结果进行排序。

  • 按随机顺序排序  使您能够按随机顺序对查询结果进行排序,或者向排序顺序中添加随机组成部分。

适用范围: SharePoint Server 2010

如何在查询请求中指定排序

如果使用查询 Web Services,则通过使用 Microsoft.Search.Query 架构中的 SortByProperties 元素指定排序条件。此元素包含一个或多个 SortByProperty 元素,其中每个元素均表示排序规范中的一个级别。

如果使用查询对象模型,则通过使用 KeywordQuery 类的 SortList 属性来指定排序条件。此属性返回 Sort 对象的集合,其中每个对象均表示排序规范中的一个级别。

如果排序规范中有多个级别,将按照排序规范中出现的顺序执行排序。基于第一个级别排序后,下一个级别只与具有为第一个级别指定的排序条件的相同值的结果有关。

可以为排序规范中的每个级别指定一个排序方向。

按排名对搜索结果进行排序

默认排序机制旨在按相关性(排名)对查询结果进行排序。这意味着 FAST Search Server 2010 for SharePoint 首先会将最相关的结果放入查询结果集中。有关如何调整相关性排名的详细信息,请参阅提高 FAST Search Server 2010 for SharePoint 的相关性

若要使用与默认排名配置文件不同的排名配置文件,可以在排序规范中指定排名配置文件的名称。

如果按排名排序,则始终能够按降序对结果进行排序。

除使用排名配置文件外,您还可以影响查询字符串中的排名计算。您可以通过以下两种方式执行此操作。

  • FAST 查询语言 (FQL) 中的 RANK 运算符或 XRANK 运算符。利用这两个运算符,您可以在满足特定查询条件的情况下应用条件排名提升。

  • 动态排名的相关性权重。当使用 FAST 查询语言 (FQL) 时,您可以为每个 STRING 运算符指定单独的相关性权重。

按托管属性值对搜索结果进行排序

可以基于查询结果中的一个或多个托管属性的值指定查询结果排序。这意味着 FAST Search Server 2010 for SharePoint 会根据与查询匹配的所有结果来执行排序。

可以基于文本和数字属性进行排序。对于文本属性,将基于标准文本字符串排序进行排序。对于数字属性(包括 Datetime 类型的托管属性),将基于数值进行排序。

按公式表达式对搜索结果进行排序

可以基于使用数学公式创建排序值的排序规范来指定查询结果排序。

按公式排序是针对查询结果的单级别和多级别排序功能的扩展。

通过使用按公式排序功能,可以对查询结果中每个项的一个或多个托管属性的值执行数学运算。

以下是可通过使用此功能来实现的功能的示例:

  • 用于分类文档的 K 近邻算法。

  • 用于计算地理距离的欧式距离或曼哈顿距离。

  • 首选值,用于基于给定的托管属性值与首选值的差距来对文档进行排序。

此功能不包括对统计动态排名参数的控制,例如词频和接近度。

公式是按从左到右的顺序计算的,并采用标准数学运算符优先顺序。也就是说,首先计算函数和附加说明的分组,然后执行乘法和除法运算,最后执行加法和减法运算。

重要注释重要说明

公式的最终结果必须在 32 位带符号整数的值范围中。否则,排序可能不正确。

在查询中指定排序公式

在查询请求的排序规范中指定排序公式而非托管属性。

排序规范具有以下格式:

[formula:<sort-formula>]

在该格式中,<sort-formula> 是排序公式表达式

备注

方括号是排序规范语法的组成部分。

默认排序方向为 Descending。您还可以使用按升序值排序的公式,例如,该公式指定地理距离。

下面的示例演示如何使用 SortByProperties 元素,在查询 Web Services 请求中指定按公式以升序排序顺序进行排序。

<SortByProperties>
  <SortByProperty name="[formula:abs(2000-size)]" direction="Ascending" /> 
</SortByProperties>

有关如何为查询添加排序规范的详细信息,请参阅如何在查询请求中指定排序

在公式中使用托管属性

可以对类型为 Integer、Decimal 和 Datetime 的托管属性值应用排序公式。必须为索引架构中指定的托管属性启用排序。

对于类型为 Decimal 的托管属性,在公式计算中使用此值之前,会将此值乘以 10^(十进制数)。

对于类型为 Datetime 的托管属性,在公式计算中使用此属性值之前,会将此值转换为自公元前 29000 年 1 月 1 日以来 100 个纳秒的数量。当年有 366 天。

排序公式表达式

表 1 列出了可在排序公式表达式中使用的函数。表达式不得包含空格。

表 1. 排序公式表达式的函数

函数

说明

+

指定加法。

-

指定减法。

*

指定乘法。

/

指定除法。

备注

默认情况下,除以 0 会产生异常,并且查询会返回一个错误。通过使用 errtolast 运算符,可以避免查询错误,并改为将失败项置于结果集的结尾处。

rank

一个表示项的动态排名的特殊关键字。

示例:abs(rank-100) 会将与排名值 100 的距离用作排序条件。

[0-9.]+

指定可作为整数值或双精度值提供的数字。

示例:503、3.14、5.4352262

[a-z0-9]+

指定将未识别为函数名的任何字符序列视为托管属性名称。必须为索引架构 (FAST Search Server for SharePoint)中指定的托管属性启用排序。

示例:可以在启用排序的情况下定义名为 height 的托管属性。这将允许您将"height"用作公式中的表达式。公式将使用 height 托管属性的值。

( and )

用于对计算进行分组,以确保正确的优先顺序。

示例:4*(3+2)

sqrt(n)

n 的平方根。

exp(n)

等效于 pow(2.71828182846,n) 的指数函数。

log(n)

n 的自然对数。

abs(n)

n 的绝对值。

ceil(n)

n 的上限。也就是说,如果 n 不是整数,则向上舍入为下一个整数。如果 n 是整数,则使用 n。

floor(n)

n 的下限。也就是说,如果 n 不是整数,则向下舍入为下一个整数。如果 n 是整数,则使用 n。

round(n)

将 n 舍入为最接近的整偶数。也称为"四舍六入五成双"或"四舍五入偶"。

sin(n)

n(以弧度为单位)的正弦。

cos(n)

n(以弧度为单位)的余弦。

tan(n)

n(以弧度为单位)的正切。

asin(n)

n(以弧度为单位)的反正弦。

acos(n)

n(以弧度为单位)的反余弦。

atan(n)

n(以弧度为单位)的反正切。

pow(x,y)

x 值的 y 次幂。

atan2(y,x)

正 x 轴与指定的笛卡尔坐标 (x,y) 之间所成弧度角的反正切(带两个参数)。

bucket(b,n1,n2,…)

可用于为表达式的给定值分发范围提供离散值的运算符。

表达式 b 可以是一个托管属性或任何其他公式表达式。参数 n1, n2, … 表示数字阈值。可以指定任意数目的桶阈值。

输入表达式 b 的给定值会向下舍入为给定的最近数字阈值。如果小于给定的最低阈值,则结果值为零。

errtolast(x)

可用于控制如何处理公式异常的运算符;x 可以是任何公式表达式。如果此公式表达式的计算导致结果集中项的数学异常,例如除以零,则这些项会出现在排序列表的末尾,不管指定的排序方向如何。

排序公式的性能特征

使用排序公式表示将对结果集中的所有匹配项应用公式计算。这意味着查询性能影响将取决于与查询匹配的项数。

带多个运算符的长公式需要比短公式更多的处理时间。

对地理距离使用按公式排序功能

可以使用按公式排序功能以应用基于距离的分级。这将需要您包含表示每个项的纬度和经度的托管属性。

例如,可以使用下列标准公式之一:

  • 曼哈顿距离。

  • 欧式距离。请参阅示例 2。

  • 半正弦公式。

重要注释重要说明

必须对经度和纬度值使用整数类型的托管属性。在内容端,您可以在一个外部管道可扩展组件中将经度和纬度值转换为整数值。在查询端,您可以在查询客户端中执行相同的转换。

示例

以下示例演示如何在查询 Web Services 请求中指定排序公式。

**示例 1。**将具有最接近 20 的 height 托管属性置于结果列表的顶部。

<SortByProperties>
  <SortByProperty name="[formula:abs(20-height)]" direction="Ascending" />
</SortByProperties>

**示例 2。**根据托管属性 latitude、longitude 和 height 中提供的位置信息,按照距给定基位置(例如,用户所在位置)的实际三维欧式距离进行排序。以下公式提供三维欧式距离,并假定基位置为 50/100/200(维度/经度/高度):

sqrt(pow(50-latitude,2)+pow(100-longitude,2)+pow(200-height,2))

若要应用基于距离的结果排序(不将距离与公式中的其他参数组合),您可以删除 sqrt() 组成部分,因为这不会更改排序序列。这样可提高查询性能。

<SortByProperties>
  <SortByProperty name="[formula:pow(50-latitude,2)+pow(100-longitude,2)+pow(200-height,2)]"
                  direction="Ascending" />
</SortByProperties>

**示例 3。**将 size 的值舍入为桶阈值,并将这些值向下舍入为下列值之一:0、5、15、50 和 100。最大值第一位置排序。

<SortByProperties>
  <SortByProperty name="[formula:bucket(size,5,15,50,100)]" direction="Ascending" />
</SortByProperties>

在查询 Web Services 中使用按公式排序

按照演练:从客户端应用程序查询 FAST Search Server 中的步骤操作,并扩展代码以添加按公式排序规范,如前面示例 1 中所述。

替换 queryXML2 字符串的定义以便在查询中添加按公式排序规范:

   // queryXML2 is the part of the XML after the query string.
   string queryXML2 = @"
         </QueryText>
      </Context>
      <ResultProvider>FASTSearch</ResultProvider>
      <Range>
         <Count>10</Count>
      </Range>
      <SortByProperties>
         <SortByProperty name='[formula:abs(20-height)]' direction='Ascending' />
      </SortByProperties>
   </Query>
</QueryPacket>";

按随机排序对搜索结果进行排序

您可以应用查询结果的随机排序,也可以向结果排序中添加随机组成部分。

随机排序规范具有以下格式:

[random:seed=<seed>:hashfield=<managed property>:addtorankmax=<max random value>]

备注

方括号是排序规范语法的组成部分。

表 2 介绍了随机排序规范的参数。

表 2. 随机排序规范的参数

参数

说明

必需

seed

用于生成随机值的种子。

种子值将输入到一个函数中以生成随机数字。最后进行排序时将会使用该随机数字。

仅使用 seed 选项将会产生随机排序的查询结果集。同一查询(如果使用同一种子)的排序顺序在更新索引后可能会发生变化。

hashfield

用作随机生成的哈希值的托管属性。

可以使用此参数来确保同一查询(如果使用同一种子)的排序顺序在更新索引后不会变化。

该托管属性必须是整数类型,并且必须已在索引架构中启用排序。

您可以使用随机或唯一值填充该托管属性(例如,由项目处理阶段填充的顺序号)。

addtorankmax

如果要对查询结果应用有限的随机化处理,可使用此参数,此时,仍将主要按排名对结果进行排序。

介于 0(零)和为此参数指定的值之间的随机值将添加到结果集中的每个项目的排名值。这允许您按一定的间隔对结果进行随机处理。

备注

这是随查询结果提供的原始(排序之前的)排名值,而不是包含随机值的排名值。

通过为相同的查询提供同一种子,将按相同顺序呈现项目。这使您能够在分页浏览搜索结果时保持相同的随机顺序。如果想要在两次查询之间意外发生索引更新时保持相同的随机顺序,请使用 hashfield 参数。

示例

以下示例演示如何在查询 Web Services 请求中指定随机排序。

**示例 1:**对整个结果集随机排序。

<SortByProperties>
  <SortByProperty name="[random:seed=5432]" />
</SortByProperties>

**示例 2:**对整个结果集随机排序。即使在发生索引切换时,也保持具有同一种子的相同查询的相同随机顺序。名为 hashvalue 的自定义托管属性在索引架构中必须可用,并使用所有索引项的随机或顺序数值进行填充。

<SortByProperties>
  <SortByProperty name="[random:seed=6543:hashfield=hashvalue]" />
</SortByProperties>

**示例 3:**向每个项目的排名值添加介于 0 到 200 之间的随机值。这会在有限范围内对结果集重新排序。

<SortByProperties>
  <SortByProperty name="[random:seed=1234:addtorankmax=200]" />
</SortByProperties>

请参阅

引用

Microsoft.Search.Query 架构中的 SortByProperties 元素

FASTSearchRuntime

概念

提高 FAST Search Server 2010 for SharePoint 的相关性

索引架构 (FAST Search Server for SharePoint)

集成外部项处理组件

演练:从客户端应用程序查询 FAST Search Server

其他资源

FAST 查询语言 (FQL)