RANK BY 子句

如果 SELECT 子句中包含排名列,则查询的结果包括查询返回的行和每行的排名值。 排名值由搜索引擎计算,并作为零到 1000 范围内的整数返回。 若要使排名结果更有意义,查询可以控制在 RANK BY 子句中计算原始排名值的方式。

本主题按如下所示进行组织:

RANK BY 子句

RANK BY 子句的语法如下所示:

WHERE ( <search_condition> ) 
RANK BY [ ( ] <rank_specification> [ ) ]

RANK BY 子句将应用于紧邻其前面的search_condition,有效指定该搜索条件返回的行的排名比另一个搜索条件返回的行要低或更高的排名。 需要search_condition周围的括号。 排名规范周围的括号是可选的。

可以将多个 RANK BY 子句应用于单个条件。 可以使用括号逐个包含其他 RANK BY 子句。

注意

全文谓词返回范围 0 到 1000 中的排名值。 非全文谓词匹配的所有文档的排名值为 1000。 对排名值的修改应考虑到此信息。

 

RANKBY 子句的rank_specification部分标识要应用于排名值的一个或多个函数。 WEIGHT 函数将乘数应用于返回行的原始排名值。 乘数越小,生成的排名值越低。 COERCION 函数可用于为返回的行相乘、添加到或设置特定的排名值。 每个排名规范可以包括零个或一个 WEIGHT 函数和零个或多个 COERCION 函数。 如果 RANK BY 子句中同时包含 WEIGHT 和 COERCION 函数,则 WEIGHT 函数必须首先。

WEIGHT 函数

WEIGHT 函数的语法为:

WEIGHT ( <weight_multipler> ) 

乘数必须是从 0.001 到 1.000 的十进制数。 搜索条件谓词返回的原始排名值乘以权重乘数来设置新的排名值。

在以下示例中,WEIGHT 函数为文档提供 System.Document.LastAuthor 字段中“Theresa”一词的文档,其中一半是 System.Author 字段中“Theresa”的排名值:

WHERE CONTAINS ( System.Author,'"Theresa"' ) 
         RANK BY WEIGHT ( 1.000 )
      OR
      CONTAINS ( System.Document.LastAuthor,'"Theresa"' ) 
         RANK BY WEIGHT ( 0.500 ) 

 

注意

CONTAINS 和 FREETEXT 谓词列权重功能支持使用搜索词和乘数(“software”:0.25)之间的冒号的速记格式。 RANK BY 子句不支持缩短的形式。

 

使用 RANK BY WEIGHT 时存在限制:它不适用于使用布尔条件的 CONTAINS 子句;例如,不允许以下示例:

CONTAINS ( System.Author,'"Theresa" OR "Teresa"' ) RANK BY WEIGHT ( 0.400 )

COERCION 函数

排名强制函数可用于通过加法或乘法或为其分配特定值来更改返回的排名值。

COERCION 函数的语法为:

COERCION ( <coercion_operation> , <coercion_value> )

强制值是整数值。

下表描述了可用的强制作设置。

强制作 描述 值范围
绝对 返回的排名值是在强制值中指定的值。 0 到 1000
加 返回的排名值是原始排名值和指定的强制值的总和。 0 到 1000
乘 返回的排名值是原始排名值和指定强制值的乘积。 0 到 1000
MINMAX 返回的排名值是指定最小值和最大强制值之间匹配项的 0-1000 排名分数的线性映射。 0 到 1000

重要

搜索只能在 0 到 1000 的范围内返回排名值。

以下示例使用 COERCION 函数设置标题中包含“computer”的所有文档,使其排名为 1000,同时将标题中包含“computer”和“software”的文档排名减少四分之一。

WHERE CONTAINS ( System.Title, 'computer' )
        RANK BY COERCION ( ABSOLUTE , 1000 )
        OR 
       CONTAINS ( System.Title, '"computer" AND "software"' )
        RANK BY COERCION ( MULTIPLY, 0.750 ) 

以下示例使用 COERCION 函数根据文档的语义匹配将术语“computer”的原始排名映射到介于 500 到 800 之间的范围。

WHERE CONTAINSSEMANTIC('text', *, 'computer', 1033)
OR CONTAINSSEMANTIC('image', *, 'computer', 1033)
RANK BY COERCION(MINMAX, 500, 800)
ORDER BY System.Search.Rank DESC

 

Merge(<merge_operation>)

与 RANK BY 子句一起使用,用于聚合来自所有结果的排名,以生成合并结果的最终排名列表。

MERGE 函数的语法如下所示:

RANK BY MERGE ( <merge_operation>) 

合并操作

下表描述了 merge_operation 参数支持的作。

合并作 描述
CONVEXCOMBINATION 当查询包含以下子句时,应专门使用此合并算法:CONTAINS(词法搜索)、CONTAINSSEMANTIC('Text',...)和 CONTAINSSEMANTIC('Image'...)(跨文本和图像进行语义搜索)。 它结合这三个子句中的分数,使用加权求和方法,通过分配比语义分数更大的权重来赋予词法分数更高的优先级。 最终排名将介于 0 到 1000 之间。
MIN 此合并算法是 AND 游标的默认行为。 它从所有结果中选择最小排名。
MAX 此合并算法是 OR 游标的默认行为。 它从所有结果中选择最大排名。

注意

将 RANK BY MERGE(MIN)与 OR 游标或 RANK BY MERGE(MAX)与 AND 游标结合使用不会产生预期的结果。 建议仅在将词法和语义搜索结果合并到单个结果集中时,才将 MERGE 函数与 RANK BY 子句显式与 CONVEXCOMBINATION 运算符结合使用。

Example

以下示例演示如何使用 MERGE 函数在词法和语义上与“Image”或“Text”字段中的单词“computer”匹配项。 然后使用 RANK BY MERGE 运算符对搜索结果进行排名,该运算符聚合来自所有结果的分数以生成最终排名列表。

WHERE (CONTAINS(*,'computer', 1033)  
OR CONTAINSSEMANTIC('Image', *, 'computer', 1033)  
OR CONTAINSSEMANTIC('Text', System.ItemNameDisplay, 'computer', 1033)  
OR CONTAINSSEMANTIC('Text', *, 'computer', 1033))  
RANK BY MERGE(CONVEXCOMBINATION) 

有关 CONTAINSSEMANTIC 谓词的详细信息,请参阅 CONTAINSSEMANTIC 谓词。