全文搜索号码在 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*"')
).
但是在您的情况下,您希望在字符串的开头 和 结尾处使用通配符。我认为您的选择仅限于:
- 如果您不需要前导通配符,则不要使用它。例如,如果您尝试匹配的文本是
007440147xxx
,那么在您的查询中使用 007440147*
就可以正常工作。
- 使用
LIKE
代替CONTAINSTABLE
,例如:SELECT * FROM Orders WHERE Column1 LIKE '%007440147%'
。这种方法的缺点是您不会获得排名值,并且查询可能需要很长时间才能执行。 (话又说回来,即使您可以在全文搜索中使用前导通配符,它们也会很慢。)
- 重新设计数据的存储和查询方式。如果不了解这些数字的含义以及需要如何查询它们,我无法提供任何建议。
- 考虑使用其他搜索产品。我相信 Lucene 可以执行前导通配符搜索,但这样的搜索往往很慢。
全文搜索编号在 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*"')
).
但是在您的情况下,您希望在字符串的开头 和 结尾处使用通配符。我认为您的选择仅限于:
- 如果您不需要前导通配符,则不要使用它。例如,如果您尝试匹配的文本是
007440147xxx
,那么在您的查询中使用007440147*
就可以正常工作。 - 使用
LIKE
代替CONTAINSTABLE
,例如:SELECT * FROM Orders WHERE Column1 LIKE '%007440147%'
。这种方法的缺点是您不会获得排名值,并且查询可能需要很长时间才能执行。 (话又说回来,即使您可以在全文搜索中使用前导通配符,它们也会很慢。) - 重新设计数据的存储和查询方式。如果不了解这些数字的含义以及需要如何查询它们,我无法提供任何建议。
- 考虑使用其他搜索产品。我相信 Lucene 可以执行前导通配符搜索,但这样的搜索往往很慢。