全文搜索号在SQL Server 2012中不起作用

时间:2015-11-13 10:43:05

标签: sql sql-server indexing sql-server-2012 full-text-search

全文搜索号码在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

1 个答案:

答案 0 :(得分:0)

问题是SQL Server不支持前导通配符(例如:*bcde)。 (更多here。)查询将在没有任何错误的情况下执行,但始终返回0结果。您只能在字符串中间使用通配符(例如:ab*de)或字符串结尾(例如:abcd*)。

通常可以通过创建包含反向字符串的列并搜索这些列来解决这个问题(例如:Column1 = abcde,Column1Reverse = edcba,查询有CONTAINS(Column1Reverse, '"edcb*"'))。

但是在您的情况下,您希望在字符串的开头结尾处使用通配符。我认为您的选择仅限于:

  1. 如果您不需要领先的通配符,请不要使用它。例如,如果您要匹配的文字为007440147xxx,则在查询中使用007440147*即可正常使用。
  2. 使用LIKE代替CONTAINSTABLE,例如:SELECT * FROM Orders WHERE Column1 LIKE '%007440147%'。这种方法的缺点是你不会获得排名值,查询可能需要很长时间才能执行。 (然后,即使您可以在全文搜索中使用前导通配符,它​​们也会很慢。)
  3. 重新设计数据的存储和查询方式。如果不了解这些数字的含义以及需要如何查询,我无法提供任何建议。
  4. 考虑使用其他搜索产品。我相信Lucene可以执行领先的通配符搜索,但这种搜索往往很慢。