Full-Text-Search

使用全文搜尋查找數字序列

  • March 20, 2018

我們有一列十位數字(帶有前導零)。我們正在嘗試查找具有特定數字序列的行。

例如,列中任何位置包含“5088”的所有行。

在這種情況下,全文搜尋 (FTS) 可以幫助我們嗎?

我們嘗試了其他方法,例如LIKE,但性能很差。

FTS 是特定於語言的;它可以幫助您在 SQL Server 中查找特定於一種語言的內容,而不是像對待數據庫中的任何其他字元串一樣對待它。

5088是一個以 10 為底的數字,我認為 FTS 在這裡不會有太大幫助。我認為你唯一的選擇是使用LIKE運營商。

要詳細了解使用 like 運算符時查詢執行緩慢的原因,請閱讀Brent OzarSargability: Why %string% Is Slow的文章。


或者,如果您總是在相關列中查找特定值,則可以使用 Computed 列,例如…

測試台

CREATE TABLE #Test (ID INT , Value VARCHAR(100))
GO

INSERT INTO #Test VALUES (1 , 'ABC'), (2 , '') , (3 , 'EFG')
                      , (4 , 'A123BC'), (1 , 'AB123C') , (1 , 'ABC123') 
GO

假設您只對具有值的行感興趣,123並且這是您始終檢查的唯一值,那麼您可以向表中添加另一列(計算),例如…

ALTER TABLE #Test
ADD IsValid  AS (CASE WHEN Value LIKE '%123%' THEN 1 ELSE 0 END)
GO

並且可能也索引該列,例如….

CREATE INDEX NIX_IsValid_Record 
ON #Test (IsValid)

現在您對帶有字元串的記錄的查詢123應該是……

Select * from #Test Where isValid = 1

即使您正在123那裡尋找帶有字元串的記錄,但您將受益於isValid列上的索引。

SQL Server 全文萬用字元的狂野方法

到目前為止,SQL Server 版本不(本機)支持前綴萬用字元用於全文索引。也許這將在未來到來。

但是通過一些程式碼,您可以獲得一些有趣的結果。

SQL Server 中存在全文索引儲存 這將每個唯一字元串儲存在 SQL Server 中以用於該全文索引。唯一的字元串成為可以搜尋正在使用的全文索引的語料庫。

請注意,諸如stopwords, stoplists,thesaurus等功能可能會限制返回的字元串。

但是,由於候選標記儲存在 SQL Server 中,因此您可以從sys.dm_fts_index_keywords視圖中獲取與萬用字元匹配的字元串。

比如我幾年前在 MSDN 論壇上發布的範常式式碼:

DECLARE @SearchText NVARCHAR(1000)
SET @SearchText = ''

-- Collect strings that match the wildcard within the full-text corpus.
-- For example only one instance of 'chocolate' is in the corpus, but     
-- There may be many full text strings with 'chocolate' in them.
-- The matching strings can be strung together with ' OR ' to 
-- create an indirect search for the wildcard.

SELECT @SearchText = @SearchText + display_term + ' OR ' 
FROM sys.dm_fts_index_keywords ( DB_ID('DBName'),
    object_id('TableName') )
WHERE display_term like '%12345%'

-- My search for '%12345%' returned two criteria "ABC12345XYZ" and "123456"
-- Now the strings that match your wildcard in the stored full text index
-- can be searched for the texts that contain your wildcard(s). 

SELECT @SearchText = LEFT (@SearchText, LEN(@SearchText) - 3)-- Trim the last ' OR '

-- Now this query will return all texts containing "ABC12345XYZ OR 123456"

SELECT * FROM TableName
WHERE CONTAINS(*, @SearchText)

-- The select returns the texts with "ABC12345XYZ OR 123456" included.

在這種情況下,候選標記的 OR 將非萬用字元字元串的完整列表提供給全文搜尋。性能基於函式返回這些值的能力。

**注意:**這擴展了全文搜尋的目的,但在其限制範圍內,它有時可能很有用。此外,您應該查看 SQL Server 全文索引中數值的行為。

引用自:https://dba.stackexchange.com/questions/161328