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

Fulltext search numbers does not work in 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

问题是 SQL 服务器不支持前导通配符(例如:*bcde)。 (更多 here。)查询将无任何错误地执行,但总是 return 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 可以执行前导通配符搜索,但这样的搜索往往很慢。