2016-11-25 63 views
1

我有一個全文檢索的視圖,該視圖返回所有業務的批准業務&元數據。全文搜索完全匹配檢查SQL Server

我實現了一個存儲過程,利用與下面的代碼的全文檢索:

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

這就是答案? http://stackoverflow.com/questions/16130526/sql-server-full-text-search-for-exact-match-with-fallback查看flups答案 – Lukek

回答

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