Sql-Server

FullTextSearch 索引/搜尋帶有特殊字元的單詞

  • April 1, 2016

我正在嘗試在 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 之前發明的。但是有幾種方法:

  1. 預處理

使用全文函式獲取大部分數據,然後使用 對其進行細化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。

  1. 列的標記化版本

儲存一個替代版本,例如一個計算列,其中“#”被替換為文字文本“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' )

顯然這裡有一些儲存成本。

考慮使用您的數據嘗試這些方法,並讓我知道您的進展情況。

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