我在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))')
这确实做了我正在寻找的事情,但不会将其标记为答案,以防万一有更好的事情。看起来不是最优雅的解决方案,它增加了全文索引的大小。