2012-05-24 27 views
0

我有一個表,用於存儲類似於文件名結構的樹。目前該表中有800萬條記錄。我正在努力快速查找文件列表,並在名稱中嵌入了特定的序列號。在文件名上使用全文搜索

FS_NODES 
----------------------------------- 
NODE_ID    bigint PK 
ROOT_ID    bigint 
PARENT_ID   bigint 
NODE_TYPE   tinyint 
NODE_NAME   nvarchar(250) 
REC_MODIFIED_UTC  datetime 
REC_DELETION_BIT  bit 

示例文件名(如存儲在節點名稱):
scriptname_SomeSerialNumber_201205240730.xml

正如預期的那樣,在LIKE語句查找文件需要幾分鐘的時間來掃描整個表,並想改善這個。沒有一致的名稱模式,因爲每個開發人員都喜歡創建自己的命名約定。

我試過使用全文搜索,真的很喜歡這個想法,但無法讓它找到基於關鍵字名稱的文件。我相信這個問題是由於下劃線。

關於如何讓這個工作的任何建議?我正在爲目錄使用中性語言。

@@VERSION 
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
Nov 24 2008 13:01:59 
Copyright (c) 1988-2005 Microsoft Corporation 
Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 

有沒有辦法改變目錄並將關鍵字手動分開? 謝謝!

回答

1

全文搜索不是答案。它用於單詞,而不是部分字符串匹配。你應該做的是,當在這個表格中插入或更新數據時,提取文件名中與未來搜索相關的部分到你可以索引的列中。畢竟,它們是您使用它們的獨立方式。你也可以考慮執行一個更可預測的命名約定,而不是讓開發者做他們想做的任何事情。

EDIT每個用戶請求:

添加計算列即REPLACE(文件名, '_','「)。或者不是計算列,而是您爲現有數據手動填充的列,並更改插入過程以處理前進。甚至將它們分解到相關表中的單獨行中。

+0

一個常見的命名約定正在起作用,但只有幫助未來。一個文件名可以包含多個關鍵字,我喜歡用fts搜索表達式樹的風格。我知道這些並不是你典型的「單詞」,但如果我能把它突破下劃線,這將是理想的解決方案。我的計劃B是在名稱中查找模式並解析出標籤中的關鍵字,但這樣做容易。感謝您的反饋意見。 – RickCard

+0

我按照你的建議添加了一個計算列,FTS能夠在目錄中使用該列。我在新列上再次嘗試了CONTAINS查詢,並且它在毫秒內與分鐘相比返回了記錄。 :) 謝謝! – RickCard