我希望能够做的是将查询发送到全文搜索,该搜索仅返回与所有字词匹配的结果。全文搜索的默认实现似乎与查询中的 ANY 字匹配,因此添加更多搜索字词会返回更多结果,而不是优化结果。
我正在使用存储过程在巨型表(> 100万条记录)上执行搜索。我无法让全文搜索按照我想要的方式工作(因为任何搜索废话),所以我用 sys.dm_fts_parser 进行了一些小技巧来定制对搜索项进行标记化,并在所有单词之间使用“AND”创建查询(要求所有单词匹配)。这似乎是一个好主意,因为它正在做我需要做的事情,但是有一个问题:从 sys.dm_fts_parser 中选择需要 sysadmin 特权,这是我在生产环境中没有的。
有没有办法以任何顺序执行所有单词搜索(不一定使用全文搜索,但这似乎是最快的内置实现),但不需要特殊权限?
DECLARE @query AS varchar(210), @inputQuery AS varchar(210)
DECLARE @tokens AS TABLE (display_term varchar(255))
-- split the search term into "words", according to the FULLTEXT stoplists
INSERT INTO @tokens
SELECT display_term
FROM sys.dm_fts_parser('"' + @input + '"', 1033, 0, 0) -- double quotes are required around the input search term
WHERE special_term = 'Exact Match' -- discard any irrelevant search terms, such as "and", "or", "the", etc.
-- create a query consisting of "word1 AND word2 AND word3 AND..." etc
SET @query = STUFF(
(SELECT ' AND ' + display_term
FROM @tokens
FOR XML PATH ('')), 1, 5, '')
SET @inputQuery = '"' + @input + '"'
DECLARE @ResultPersons AS TABLE (perPKID int)
INSERT INTO @ResultPersons (perPKID) (
SELECT perPKID FROM Persons WHERE CONTAINS(perNameComputed, @inputQuery) -- exact matches go to the top of the results list
UNION
SELECT perPKID FROM Persons WHERE CONTAINS(perNameComputed, @query)
)