使用全文搜尋查找數字序列
我們有一列十位數字(帶有前導零)。我們正在嘗試查找具有特定數字序列的行。
例如,列中任何位置包含“5088”的所有行。
在這種情況下,全文搜尋 (FTS) 可以幫助我們嗎?
我們嘗試了其他方法,例如
LIKE
,但性能很差。
FTS 是特定於語言的;它可以幫助您在 SQL Server 中查找特定於一種語言的內容,而不是像對待數據庫中的任何其他字元串一樣對待它。
5088
是一個以 10 為底的數字,我認為 FTS 在這裡不會有太大幫助。我認為你唯一的選擇是使用LIKE
運營商。要詳細了解使用 like 運算符時查詢執行緩慢的原因,請閱讀Brent Ozar
Sargability: 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 全文索引中數值的行為。