我正在使用全文搜索在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;
对于这个人为的例子,我希望用户能够提供搜索条件山和替换,并让它返回相对较高等级的记录,包含替换和山附近的记录,但我不知所措如何到达那里。
答案 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