Sql-Server
FullTextSearch 索引/搜尋帶有特殊字元的單詞
我正在嘗試在 FullTextSearch 索引列中查詢主題標籤
SELECT Bio FROM Users WHERE CONTAINS (Bio,'promoter') SELECT Bio FROM Users WHERE CONTAINS (Bio,'#promoter')
兩個結果都返回相同的記錄
promoter of #Art
我還嘗試在搜尋詞周圍加上雙引號,
"#promoter"
但結果相同。我在搜尋時遇到同樣的問題
'@something'
為了讓 FullTextSearch 索引特殊字元,我需要做什麼?
嗯,恐怕 ‘#’ 算作標點符號,而 SQL Server 全文索引是在 Twitter 之前發明的。但是有幾種方法:
- 預處理
使用全文函式獲取大部分數據,然後使用 對其進行細化
Like
,例如SELECT Id INTO #tmp FROM dbo.Users WHERE CONTAINS ( Bio, '#promoter' ) SELECT * FROM dbo.Users u WHERE u.Bio Like '%#promoter%' AND EXISTS ( SELECT * FROM #tmp t WHERE u.Id = t.Id )
雖然您可以使用
CONTAINSTABLE
在一個查詢中執行相同的操作,但您不一定能保證計劃將採用什麼順序 - 為什麼會這樣,T-SQL 畢竟是聲明性的。我更喜歡明確,但如果您發現性能可以接受和/或數據量很低,請將兩者結合起來,例如SELECT * FROM dbo.Users u INNER JOIN CONTAINSTABLE ( Users, Bio, '"#promoter"' ) ct ON u.Id = ct.[key] WHERE u.Bio Like '%#promoter%'
我在一個 100 萬行的表上做了一些簡單的測試,它似乎表現不錯。YMMV。
- 列的標記化版本
儲存一個替代版本,例如一個計算列,其中“#”被替換為文字文本“hashtag”,如下所示:
-- Add computed column ALTER TABLE dbo.Users ADD cleanBio AS REPLACE ( Bio, '#', 'hashtag' ) -- Add the computed column to full-text index ALTER FULLTEXT INDEX ON dbo.Users ADD ( cleanBio ) GO SELECT * FROM dbo.Users WHERE CONTAINS ( cleanBio, 'hashtagpromoter' )
顯然這裡有一些儲存成本。
考慮使用您的數據嘗試這些方法,並讓我知道您的進展情況。