2016-08-22 37 views
2

我從前端獲取一些字符串,我想在全文索引視圖中找到與儘可能多的這些字符串匹配的所有條目。例如字符串將是:排名幾個字符串的全文搜索結果

Bla di bladi 

這可以被翻譯成這個查詢:

SELECT 
    * 
FROM [Schema].[SomeFullTextIndexedView] 
WHERE CONTAINS (*, '"*bla*" OR "*di*" OR "*bladi*"') 

工作正常。讓我們說,因爲參數的緣故查詢返回的結果:

Column1 Column2 Column3 
bla rte  
bla di xxx 
bladi tttytyt  
bla di bladi 

我還要做的是引進某種等級,其中等級越大越字符串匹配。該排名然後用於對結果進行降序排序:

Column1 Column2 Column3 Rank 
bla di bladi 3 
bla di xxx 2 
bla rte  1 
bladi tttytyt  

1 

在全文搜索中是否有任何內容可供我利用?謝謝。

回答

1

共通之處,你可以使用FREETEXTTABLE返回RANK列:

SELECT 
    * 
FROM [Schema].[SomeFullTextIndexedView] AS t 
INNER JOIN FREETEXTTABLE([Schema].[SomeFullTextIndexedView] , *, '"*bla*" OR "*di*" OR "*bladi*"') as k ON t.Id = k.[key] 
ORDER BY k.[RANK] DESC 

但在你的例子文本字符串是不相關的,它always returns 0。試試真實的數據。

+0

注:'ORDER BY RANK'不'KEY' – gofr1

+0

@ gofr1是的,謝謝!免費編輯答案! – Backs

+0

這個效果很好。只是好奇,我將如何在這種情況下實現模糊搜索?讓我們說提供的搜索字符串是bal,但數據庫只包含字符串bla和bladi。 – cs0815

0

您可以使用CONTAINSTABLE

由CONTAINSTABLE生成的表包含一個名爲列RANK。 RANK列是每行的值(從0到1000),表示 行匹配選擇標準的程度。

SELECT * 
FROM [Schema].[SomeFullTextIndexedView] t 
INNER JOIN CONTAINSTABLE([Schema].[SomeFullTextIndexedView], ColumnToSearch, '"*bla*" OR "*di*" OR "*bladi*"') c 
    ON t.ID = c.[KEY] 
ORDER BY [RANK] DESC