是否可以在单个CONTAINSTABLE搜索条件中组合屈折和邻近搜索?

时间:2011-01-05 23:01:27

标签: sql sql-server-2008 full-text-search

我正在使用全文搜索在AdventureWorks数据库中玩游戏。在production.ProductDescription中我试图搜索“山”和“替换”。

我知道有以下描述的记录:

High-performance mountain replacement wheel.

我的第一个问题是:

SELECT 
  pd.Description, 
  ct.RANK
FROM Production.ProductDescription AS pd 
  INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'mountain NEAR replacements' 
  ) AS ct ON pd.ProductDescriptionID = ct.[KEY]
ORDER BY ct.RANK DESC;

这返回0行。如果我将'mountain NEAR replacements'更改为'mountain NEAR replacement',我会在结果数据集中得到我期望的记录。

我的下一次尝试是尝试以下内容:

SELECT 
  pd.Description, 
  ct.RANK
FROM Production.ProductDescription AS pd 
  INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'FORMSOF(INFLECTIONAL, "replacements") NEAR "mountain"' 
) AS ct ON pd.ProductDescriptionID = ct.[KEY]
ORDER BY ct.RANK DESC;

但这会产生错误

Syntax error near 'NEAR' in the full-text search condition 'FORMSOF(INFLECTIONAL, "replacements") NEAR "mountain"'.

我看了一下CONTAINSTABLE的语法,结果证明你在相同的搜索条件下不能有一个generation_term(例如FORMSOF())和一个邻近项(例如NEAR)。

我在表格中添加了以下记录:

Replacement parts for you omg gee-whiz mountain

该记录在以下fts查询中排名很高(96):

SELECT 
  pd.Description, 
  ct.RANK
FROM Production.ProductDescription AS pd 
  INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    'FORMSOF(INFLECTIONAL,"replacements") AND "mountain"' 
  ) AS ct ON pd.ProductDescriptionID = ct.[KEY]     
ORDER BY ct.RANK DESC;

但正如预期在此查询中排名较低(32):

SELECT 
  pd.Description, 
  ct.RANK
FROM Production.ProductDescription AS pd 
  INNER JOIN CONTAINSTABLE(
    Production.ProductDescription, 
    Description, 
    '"replacement" NEAR "mountain"' 
) AS ct ON pd.ProductDescriptionID = ct.[KEY]
ORDER BY ct.RANK DESC;

对于这个人为的例子,我希望用户能够提供搜索条件山和替换,并让它返回相对较高等级的记录,包含替换和山附近的记录,但我不知所措如何到达那里。

1 个答案:

答案 0 :(得分:2)

您添加的最后一条记录“替换部件为您提供了geg-whiz mountain”

单词替换并不是真正靠近单词mountain,这就是排名很低的原因。

在Adventureworks示例中,您正在查看的产品描述实际上是非常短的字段,而不是NEAR运算符的用途。

在这种情况下,我只会使用

'FORMSOF(INFLECTIONAL, "replacement") AND FORMSOF(INFLECTIONAL, "mountain")' 

或与您的CONTAINSTABLE示例相关的变种。

SELECT  
  pd.Description,  
  ct.RANK 
FROM Production.ProductDescription AS pd  
  INNER JOIN CONTAINSTABLE( 
    Production.ProductDescription,  
    Description,  
    'FORMSOF(INFLECTIONAL,"replacements") AND FORMSOF(INFLECTIONAL,"mountain")'  
  ) AS ct ON pd.ProductDescriptionID = ct.[KEY]      
ORDER BY ct.RANK DESC; 

有趣的是,你所说的查询给你96个排名,只给我32个排名。我使用SQL Server 2005进行测试,并使用默认值在Product.ProductDescription.Description上设置全文索引。

很难说这里对更高排名的确切贡献是什么,这些非常相似的条目有不同的排名: 更换山地车轮为入门级骑手。 - 96 替换山轮为休闲到严肃的骑手。 - 48