2015-11-13 49 views
0

全文搜索號在SQL Server中不起作用2012全文搜索次數並不在SQL Server 2012工作

我試圖創建一個empty_stoplist和重新填充索引。任何人都可以告訴我我在這裏做錯了什麼?

CREATE FULLTEXT CATALOG Orders_FTS 
WITH ACCENT_SENSITIVITY = OFF; 
GO 

CREATE FULLTEXT INDEX ON dbo.Orders 
( 
    a Language 1031, 
    b Language 1031, 
    c Language 1031, 
    d Language 1031 
) 
KEY INDEX [PK_Orders] 
ON Orders_FTS; 
GO 

CREATE FULLTEXT STOPLIST EMPTY_STOPLIST; 
ALTER FULLTEXT STOPLIST empty_stoplist DROP ALL; 
ALTER FULLTEXT INDEX ON Orders SET STOPLIST EMPTY_STOPLIST; 
ALTER FULLTEXT INDEX ON Orders SET STOPLIST = OFF; 
ALTER FULLTEXT INDEX ON Orders START UPDATE POPULATION; 

SQL查詢:

SELECT 
    T.*, R.RANK 
FROM 
    Orders As T 
INNER JOIN 
    CONTAINSTABLE(Orders, *, '"*007440147*"') AS R On T.ID = R.[KEY] 
ORDER BY 
    RANK DESC, ID DESC 
+0

您不能在字符串的開頭使用通配符。這是SQL Server的限制。這可能是問題嗎?如果沒有,你能提供更多關於發生錯誤的詳細信息(錯誤信息?0結果?)以及你想匹配什麼字符串? – Keith

+0

@Keith事實上,通配符效果最好。如果我搜索數字部分(通配符),它根本不會返回結果。我很好奇,因爲我搜索的所有字段都是nvarchar字段。我使用了'''ALTER FULLTEXT STOPLIST empty_stoplist DROP ALL;''來搜索特殊的字符,比如'''''''''''''''這非常好,但它對數字沒有任何影響。 –

+0

您能否提供您嘗試匹配的表中的術語示例? – Keith

回答

0

的問題是,領先的通配符(例如:*bcde)不受SQL Server支持。 (更多here。)查詢將執行沒有任何錯誤,但總是會返回0結果。您只能在字符串中間使用通配符(例如:ab*de)或字符串的末尾(例如:abcd*)。

通常,這可以通過創建包含反向字符串列和這些列來搜索周圍的工作(例如:列1 = abcde,Column1Reverse = edcba,查詢有CONTAINS(Column1Reverse, '"edcb*"'))。

但是在你的情況下,你想在字符串的開頭使用通配符。我覺得你的選擇是有限的到:

  1. 如果你並不需要一個領導通配符,那麼就不要使用它。例如,如果您嘗試匹配的文本是007440147xxx,則在查詢中使用007440147*將正常工作。
  2. 使用LIKE而不是CONTAINSTABLE,例如:SELECT * FROM Orders WHERE Column1 LIKE '%007440147%'。這種方法的缺點是你不會得到排名值,查詢可能需要很長時間才能執行。 (再次,即使您可以在全文搜索中使用領先的通配符,它​​們也會很慢。)
  3. 重新設計數據如何存儲和查詢。如果不理解這些數字的含義以及他們需要如何查詢,我無法提供任何建議。
  4. 請考慮使用其他搜索產品。我相信Lucene可以執行領先的通配符搜索,但這樣的搜索往往很慢。