全文搜索号码在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 :(得分:0)
问题是SQL Server不支持前导通配符(例如:*bcde
)。 (更多here。)查询将在没有任何错误的情况下执行,但始终返回0结果。您只能在字符串中间使用通配符(例如:ab*de
)或字符串结尾(例如:abcd*
)。
通常可以通过创建包含反向字符串的列并搜索这些列来解决这个问题(例如:Column1 = abcde
,Column1Reverse = edcba
,查询有CONTAINS(Column1Reverse, '"edcb*"')
)。
但是在您的情况下,您希望在字符串的开头和结尾处使用通配符。我认为您的选择仅限于:
007440147xxx
,则在查询中使用007440147*
即可正常使用。LIKE
代替CONTAINSTABLE
,例如:SELECT * FROM Orders WHERE Column1 LIKE '%007440147%'
。这种方法的缺点是你不会获得排名值,查询可能需要很长时间才能执行。 (然后,即使您可以在全文搜索中使用前导通配符,它们也会很慢。)