我在视图上进行全文搜索,该视图返回所有已批准的商家&有关该业务的元数据。
我使用以下代码实现了一个存储过程来利用全文搜索:
CREATE PROCEDURE [dbo].[Search]
@SearchTerm varchar(8000),
@CurrentPage int = 1,
@PageSize int = 100
AS
BEGIN
DECLARE @NearPredicate varchar(8000),
@AndPredicate varchar(8000),
@TotalRecords int
SELECT
@NearPredicate = COALESCE(@NearPredicate + ' NEAR ', '') + Data
FROM Split(@SearchTerm, ' ')
LEFT JOIN sys.fulltext_system_stopwords ON Data = stopword
WHERE stopword IS NULL
SET @AndPredicate = REPLACE(@NearPredicate, 'NEAR', 'AND')
SET @NearPredicate = '(' + @NearPredicate + ')'
SET @TotalRecords = (
SELECT
COUNT(*)
FROM
vwApprovedBusiness
WHERE FREETEXT(*, @AndPredicate )
)
SELECT *,
ct.Rank,
@TotalRecords AS TotalRecords
FROM
vwApprovedBusiness a
INNER JOIN FREETEXTTABLE (vwApprovedBusiness, *, @NearPredicate ) AS ct ON a.MyBusinessID = ct.[KEY]
ORDER BY
ct.RANK DESC
OFFSET (@CurrentPage - 1) * @PageSize ROWS FETCH NEXT @PageSize ROWS only
END
如果我搜索商家名称,例如 One Guy Transport 是一项经过批准的商家,它只会在我的搜索结果中显示在第6或第7位,而不是预期的第一个结果。对此的任何帮助将不胜感激!
答案 0 :(得分:1)
我建议将全文搜索调用从FREETEXT / FREETEXTTABLE转换为CONTAINS / CONTAINSTABLE,因为我认为当您搜索说明商家名称时,FREETEXT是不合适的。根据MSDN文档Query with Full-Text Search:
CONTAINS和FREETEXT对于不同类型的匹配非常有用,如下所示:
对单个单词和短语的精确或模糊(不太精确)匹配使用CONTAINS(或CONTAINSTABLE),在一定距离内的单词距离或加权匹配。
使用FREETEXT(或FREETEXTTABLE)匹配指定单词,短语或句子(自由文本字符串)的含义,但不是精确的措辞。如果在指定列的全文索引中找到任何术语的任何术语或形式,则会生成匹配。
因此,在搜索商家名称时,您肯定希望获得精确匹配,因此必须使用CONTAINS。
如果在搜索业务元数据时CONTAINS / CONTAINSTABLE产生的结果很少,您可以在UI中拆分搜索类型,并在按名称搜索时使用CONTAINS,而在按业务描述/元数据搜索时使用FREETEXT。我个人认为CONTAINS在两种情况下都可以。
另一个注意事项,在您的查询中,您有一个单独的FTS调用来获取@TotalRecords计数,但您可以将该权限嵌入主搜索调用中:
SELECT *,
ct.Rank,
-- @TotalRecords AS TotalRecords
COUNT(*) over () as TotalRecords
FROM
vwApprovedBusiness a
INNER JOIN FREETEXTTABLE (vwApprovedBusiness, *, @NearPredicate ) AS ct ON a.MyBusinessID = ct.[KEY]
HTH