0

我在 SQL Server 框中有一个关键字表,当前存储有全文索引。我被要求在我们的搜索中添加一个工具,在结果更接近列开头的地方优先考虑结果。

CREATE TABLE [dbo].[ftsTest]
(
    [ID] [INT] NOT NULL,
    [Keywords] [NVARCHAR](MAX) NOT NULL,

    CONSTRAINT [PK_ftsTest] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

INSERT INTO [dbo].[ftsTest]
VALUES (1, N'Test Two Three Four Five Six Seven Eight Nine Ten'), 
       (2, N'One Test Three Four Five Six Seven Eight Nine Ten'), 
       (3, N'One Two Test Four Five Six Seven Eight Nine Ten'), 
       (4, N'One Two Three Test Five Six Seven Eight Nine Ten'), 
       (5, N'One Two Three Four Test Six Seven Eight Nine Ten'), 
       (6, N'One Two Three Four Five Test Seven Eight Nine Ten'), 
       (7, N'One Two Three Four Five Six Test Eight Nine Ten'), 
       (8, N'One Two Three Four Five Six Seven Test Nine Ten'), 
       (9, N'One Two Three Four Five Six Seven Eight Test Ten'), 
       (10, N'One Two Three Four Five Six Seven Eight Nine Test ')

在为此设置通用全文搜索后,我可以使用以下任一方法生成结果列表:

SELECT *
FROM ftsTest
WHERE CONTAINS (Keywords, 'test')

SELECT *
FROM CONTAINSTABLE(ftsTest, Keywords, 'test')

查询返回预期结果Contains,但没有优先级。该ContainsTable查询确实返回一个排名,但为每个排名分配了相同的值。

我知道排名考虑了出现(单词在文档中的偏移量),但我不知道如何访问该数据。这可能是我的 RTFM 错误,但我看不出如何影响排名以帮助满足客户的要求。

我一直在查看https://technet.microsoft.com/en-us/library/ms142524(v=sql.105).aspx但我仍然有点摸不着头脑。

我目前正在开发多个版本的 SQL Server(2008 R2 到 2016),但看起来我们将来会全部更新到 2016。

感激地收到任何帮助。

非常感谢。

可能的解决方案:

FTS 可以选择按单词的接近程度进行排名。通过在字段的开头添加一个控制词,我可以计算与该词的距离来给我一个排名。

UPDATE ftsTest  
SET keywords = '_start_ ' + keywords

SELECT *
FROM CONTAINSTABLE(ftsTest, Keywords, 'NEAR((_start_,test))')

这确实可以满足我的要求,但不会将其标记为答案,以防有人有更好的东西。似乎不是最优雅的解决方案,它增加了全文索引的大小。

4

0 回答 0