全文搜索完全匹配检查SQL Server

时间:2016-11-25 01:41:39

标签: sql sql-server full-text-search

我在视图上进行全文搜索,该视图返回所有已批准的商家&有关该业务的元数据。

我使用以下代码实现了一个存储过程来利用全文搜索:

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位,而不是预期的第一个结果。对此的任何帮助将不胜感激!

1 个答案:

答案 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