2012-11-14 53 views
0

我有一個應用程序,允許用戶在全文搜索

所以我用全文檢索像下面多列(PROD_NAME,prod_desc)搜索,但是它不返回所有的記錄,爲excample我試着在2列(prod_name,prod_desc)中找到'o'字符,但找不到某些記錄。 另外,當我不使用通配符作爲'o'字符時,它找不到任何東西,而包含像%o%這樣的手段。 我對全文搜索有點困惑。

請幫助是什麼問題。

CREATE FULLTEXT CATALOG catalog_crashcourse3; 

CREATE FULLTEXT INDEX ON products(prod_name,prod_desc) 
KEY INDEX pk_products ON catalog_crashcourse3; 

SELECT prod_name, prod_desc 
FROM products 
WHERE CONTAINS((prod_name,prod_desc), '"*o*"'); 
+0

最好的辦法是將此問題移至dba.stackexchange.com – NotMe

+0

什麼是列數據類型?多少行? FULLTEXT是否需要在這裏,或者你可以使用LIKE'%o%'? – MikeSmithDev

+0

prod_name(nchar(255)),prod_desc(ntext),我的行很多,我喜歡用作linq項目中的存儲過程搜索按鈕 – masoud

回答

0

SQL Server FTS是一個基於單詞的搜索過程。在列上創建全文索引時,索引引擎會抓取內容並在稱爲標記化的過程中將其分解爲單個單詞。索引然後存儲單詞,它所在行的主鍵,以及單詞在內容中的位置(即,是該字段中的第一個單詞,第57個單詞或其他)。

當您指定CONTAINS謂詞如

CONTAINS((prod_name,prod_desc), '"o"'); 

在SQL Server FTS引擎查找其指數是「O」標記(即字)。如果您的內容中沒有「o」字(可能不是),則不會找到匹配結果。

正如您所指出的那樣,您可以進行通配符搜索,您可以在其中嘗試並在索引單詞中匹配模式。例如,如果你指定一個謂詞如

CONTAINS((prod_name,prod_desc), '"o*"'); 

那麼搜索將返回索引內容以字母「O」

FTS,最好使用當你想搜索開始的所有單詞索引內容中的單詞組。它可以進行復雜的詞幹(如在指定「運行」時搜索「運行」和「運行」)。它還提供搜索結果內容的排名,以便您可以找到最佳匹配。如果您只想在您的內容中搜索指定的單詞並且內容不太大,則可能不需要FTS。正如MikeSmithDev在評論中指出的那樣,您可能只能使用LIKE子句。

注意補充:在回答您的意見,如果你有,你想用FTS搜索與8列的表,那麼你會在這些列上創建全文索引和搜索它們,如下所示:

CONTAINS(*, '"Word"') 

其中星號表示表中所有8個索引列應該包含在搜索中。

+0

謝謝,我怎麼不得不使用like(什麼是最好的方式)當我想在表格的所有列(8列)中搜索特定單詞時。 – masoud

+0

如果要搜索表中的所有8個索引列,請在CONTAINS謂詞中爲字段說明符使用星號。看到我上面的帖子,我修改了這個附加信息。謝謝。 –

0

你有兩個問題:

  1. 您正在使用前綴通配符*o的SQL Server FTS是 無奈用。它只適用於後綴通配符,如word*

  2. 您正在使用單個字符的搜索詞。默認情況下,單字字 從FT索引中排除,這是一件好事。 除非另有規定,否則SQL Server在創建索引時默認關聯繫統 全文停止列表

要查看默認非索引字表數據庫是使用你的背後,如果你真的想搜索單個字符使用此查詢

Select SysStop.stopword, Langs.name 
From sys.fulltext_system_stopwords SysStop 
    Inner Join sys.fulltext_languages Langs 
    On Langs.lcid = SysStop.language_id; 

,你可以刪除和 使用重建FT指數選項WITH STOPLIST OFF,但準備 有很多噪音。見Create FullText Index