2011-09-28 92 views
1

我創建這個小樣本表的人。全文目錄無法搜索主鍵

enter image description here

ID是一個主鍵,是身份=真

現在,當我嘗試創建一個全文目錄,我無法搜索的ID。

enter image description here

如果我按照這個嚮導,我會用一個目錄,在那裏它唯一能夠搜索一個人的名字告終。我真的很想知道,我可以如何讓全文搜索Id和Name。

編輯

enter image description here

SELECT * 
FROM [TestDB].[dbo].[Person] 
WHERE FREETEXT (*, 'anders'); 

SELECT * 
FROM [TestDB].[dbo].[Person] 
WHERE FREETEXT (*, '1'); 

我想他們返回相同的結果,第一返回ID = 1 name =安德斯,而第二個查詢不返回任何東西。

編輯2

貌似問題是在使用INT,但它是不可能欺騙全文支持它?

編輯3

創建,我的INT轉換爲nvarchar的視圖。 CONVERT(nvarchar(50), Id) AS PersonId這確實有可能對我來說,選擇該列,創建全文目錄時,但它仍然不會讓我找到它搜索的標識。

回答

2

從閱讀你的問題,我不知道你理解全文索引的目的。全文索引旨在搜索表格上的TEXT(一列或多列)。而不是僅僅作爲一個替代:

SELECT * 
FROM table 
WHERE col1 LIKE 'Bob''s Pizzaria%' 
OR col2 LIKE 'Bob''s Pizzaria%' 
OR col3 LIKE 'Bob''s Pizzaria%' 

它還允許你搜索像「鮑勃PiZZ組è RIA」「鮑勃的Pizzaria嗎」的變化(萬一有人拼錯比薩店或忘記放在'或過於熱心防SQL注入代碼剝離「)或‘羅伯特的比薩’或‘Bob的披薩’或‘Bob的披薩’,等等。它也可以讓你‘在中間’文本列的搜索(焦炭, varchar,nchar,nvarchar等),沒有可怕的「%Bob%Pizza%」,消除了使用傳統索引的可能性。

足以與講座,但是。爲了回答您的具體問題,我想創建一個單獨的列(不是「計算列」)「IdText VARCHAR(10)」,然後一個AFTER INSERT觸發器是這樣的:

UPDATE t 
SET IdText = CAST(Id AS varchar(10)) 
FROM table AS t 
INNER JOIN inserted i ON i.Id = t.Id 

如果你不知道「插入」是什麼,請參閱此MSDN article或搜索堆棧溢出以查找「觸發插入」。然後,您可以在全文索引中包含IdText列。

再次,從你的榜樣,我不知道,全文索引是你應該在這裏使用的,但話又說回來你的實際情況可能是不同的東西,你剛剛創建的這個例子的問題。此外,全文索引相對「昂貴」,因此請確保您進行成本收益分析。這是關於全文索引使用的Stack Overflow問題。

1

爲什麼不只是做這樣的查詢。

SELECT * 
FROM [TestDB].[dbo].[Person] 
WHERE FREETEXT (*, '1') 
OR ID = 1 

如果首先檢查搜索項是否是數字,您可以忽略「OR ID = 1」部分。