本文介紹了忽略SQL Server中全文搜索(FREETEXTTABLE)搜索列中的破折號(-)的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我使用CONTAINSTABLE
作為我的搜索算法。我想搜索列值,忽略破折號,特別是列值。例如,列包含‘12345-67’,則應使用‘1234567’進行搜索,如下所示。
SELECT *
FROM table1 AS FT_Table
INNER JOIN CONTAINSTABLE(table2, columnname, '1234567') AS Key_Table ON FT_Table.ID = Key_Table.[Key]
在搜索不包含破折號(-)的字符串時,有什么方法可以忽略破折號(-)嗎?
推薦答案
我做了一些調查,花了幾個小時:)
不幸的是,沒有辦法執行它。看起來像是SQL Server FTS通過斷開單詞(空格除外)以及特殊字符(-、{、(等))來填充單詞
但它不能填充完整的Word,我的理解是,沒有辦法提供一些填充規則來滿足需求。(我的意思是,告訴人口服務部門,如果這個詞包含”-“,請用””代替。)
我提供了一個澄清情況的例子。
首先,為表創建表、FTS目錄、全文索引并插入示例行。
CREATE TABLE [dbo].[SampleTextData]
(
[Id] int identity(1,1) not null,
[Text] varchar(max) not null,
CONSTRAINT [PK_SampleTextData] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
);
CREATE FULLTEXT CATALOG ftCatalog AS DEFAULT;
CREATE FULLTEXT INDEX ON SampleTextData
(Text)
KEY INDEX PK_SampleTextData
ON ft
INSERT INTO [SampleTextData] values ('samp-le text')
然后,提供示例查詢;
select * from containstable(SampleTextData,Text,'samp-le') --Success
select * from containstable(SampleTextData,Text,'samp') --Success
select * from containstable(SampleTextData,Text,'le') --Success
select * from containstable(SampleTextData,Text,'sample') -- Fail
這些樣本都是成功的,只有一個Samp-le例外。要調查情況,請執行此查詢;
SELECT display_term, column_id, document_count
FROM sys.dm_fts_index_keywords (DB_ID('YourDatabase'), OBJECT_ID('SampleTextData'))
輸出:
le 2 1
samp 2 1
samp-le 2 1
text 2 1
END OF FILE 2 1
查詢給我們的Word結果由FTS填充服務填充。如您所見,總體結果包含‘le’、‘samp’、‘samp-le’,但不包含‘Sample’。這就是sample
查詢失敗的原因。
這篇關于忽略SQL Server中全文搜索(FREETEXTTABLE)搜索列中的破折號(-)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,