我有一个SQL Server表,我正在尝试理解全文搜索: - )
我在表Entry
上设置了全文目录和全文索引,其中包含名为VARCHAR(20)
的{{1}}列。
该表中大约有200'000行,VPN-ID
列的值如下:
VPN-ID
现在我正在尝试使用全文启用搜索来查找该表中的行。
当我这样做时
VPN-000-359-90
VPN-000-363-85
VPN-000-362-07
VPN-000-362-91
VPN-000-355-55
VPN-000-368-36
VPN-000-356-90
一切都很好,花花公子,我的行也会被退回。
当我开始使用这样的通配符搜索时:
SELECT (list of columns)
FROM dbo.Entry
WHERE CONTAINS(*, 'VPN-000-362-07')
我得到了结果,一切似乎都很好。
HOWEVER:当我这样搜索时:
SELECT (list of columns)
FROM dbo.Entry
WHERE CONTAINS(*, 'VPN-000-362-%')
突然间我根本没有得到任何结果.....即使明显行符合该搜索条件......
任何想法为什么?还有哪些其他“惊喜”全文搜索可供我使用? : - )
更新:创建我使用的全文目录:
SELECT (list of columns)
FROM dbo.Entry
WHERE CONTAINS(*, 'VPN-000-36%')
并在我的桌子上创建全文索引,我使用
CREATE FULLTEXT CATALOG MyCatalog WITH ACCENT_SENSITIVITY = OFF
我尽力避免任何“古怪”选项。
经过一番调查后,更新#2:,似乎SQL Server全文搜索以某种方式将字符串中的破折号解释为分隔符....
虽然此查询不返回任何内容:
CREATE FULLTEXT INDEX
ON dbo.Entry(list of columns)
KEY INDEX PK_Entry
这一个(在破折号上拆分搜索词):
SELECT (list of columns)
FROM dbo.Entry
WHERE CONTAINS(*, '"VPN-000-362*"')
好的 - 似乎有点奇怪,破折号似乎导致分裂,不知何故不起作用.....
答案 0 :(得分:6)
你使用Language for Word Breaker
吗?你试过Neutral
吗?
编辑:
在adition中你应该使用WHERE CONTAINS([Column], '"text*"')
。有关MSDN的详细信息,请参阅Prefix Searches:
℃。使用CONTAINS和
以下示例返回all 产品名称至少包含一个单词 从中的前缀链开始 名称栏。
USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO
答案 1 :(得分:2)
只是想知道,但你为什么不这样做:
SELECT (list of columns)
FROM dbo.Entry
WHERE [VPN-ID] LIKE 'VPN-000-36%'
在我看来,全文搜索不适合这项工作。只需在该列上使用普通索引。