Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server全文搜索未找到我的行_Sql Server_Sql Server 2008_Full Text Search - Fatal编程技术网

Sql server SQL Server全文搜索未找到我的行

Sql server SQL Server全文搜索未找到我的行,sql-server,sql-server-2008,full-text-search,Sql Server,Sql Server 2008,Full Text Search,我有一个SQL Server表,我正在尝试理解全文搜索:- 我已经在一个表条目上设置了一个全文目录和一个全文索引,其中包括一个名为VPN-ID的VARCHAR20列 该表中约有200000行,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 现在,我正在尝试使用支持全文搜索的方法查找该表中的行 当我这样做的时候

我有一个SQL Server表,我正在尝试理解全文搜索:-

我已经在一个表条目上设置了一个全文目录和一个全文索引,其中包括一个名为VPN-ID的VARCHAR20列

该表中约有200000行,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')
一切都很好,丹迪和我的行都回来了

当我开始使用如下通配符搜索时:

SELECT (list of columns)
FROM dbo.Entry
WHERE CONTAINS(*, 'VPN-000-362-%')
SELECT (list of columns)
FROM dbo.Entry
WHERE CONTAINS(*, 'VPN-000-36%')
我得到了结果,一切似乎都很好

但是:当我这样搜索时:

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
为了在我的表上创建全文索引,我使用

CREATE FULLTEXT INDEX 
ON dbo.Entry(list of columns)
KEY INDEX PK_Entry
我尽量避免任何古怪的选择

更新2:经过进一步调查,SQL Server全文搜索似乎以某种方式将字符串中的破折号解释为分隔符

虽然此查询不返回任何内容:

SELECT (list of columns)
FROM dbo.Entry
WHERE CONTAINS(*, '"VPN-000-362*"')
这一个在破折号上拆分搜索词:

SELECT (list of columns)
FROM dbo.Entry
WHERE CONTAINS(*, ' "VPN" AND "000" AND "362*"')
好的-看起来有点奇怪,一个破折号似乎会导致某种程度上不起作用的分裂…..

您使用哪种语言作为分词器?你试过中性的吗

编辑: 在注释中,应使用WHERE CONTAINS[列],“text*”。有关以下方面的更多信息,请参阅:

C.将包含项与

下面的示例返回所有 至少有一个单词的产品名称 从中的前缀链开始 名称列


顺便说一句。。。类似的问题和

只是想知道,但你为什么不这样做:

SELECT (list of columns)
FROM dbo.Entry
WHERE [VPN-ID] LIKE 'VPN-000-36%'

在我看来,全文搜索并不是这份工作的合适工具。只需在该列上使用普通索引。

您可以添加创建全文索引/目录的代码吗?也许有一些奇怪的选项…我认为-只是被当作一个断字字符,根本没有在搜索中使用。从sys.dm_fts_parser'VPN-000-362*'中选择*号,1033,NULL,0,但如果更改语言参数,其中一个-保留。从sys.dm_fts_解析器“VPN-000-362*”中选择*,0,NULL,0。奇怪的我不知道这里有什么规则。请看我上面的创建脚本-我没有指定任何特殊的内容;据我所知,SQL Server在我的所有语言中都使用英语。如果将其更改为中性,您会得到什么结果?结果保持不变-使用“VPN-000-362-%”可以找到,但使用“VPN-000-36%”找不到任何结果我在哪里尝试过*,“VPN-000-36*”但结果是相同的-没有行:-即使它们肯定是与该临界值匹配的行!即使我在CONTAINS中指定了我想要避免的确切列名,我仍然没有得到任何结果……我希望能够搜索几十个字段——我不喜欢必须搜索字段1、字段2、字段3等等的想法。全文搜索可以一次搜索整个全文索引,考虑到性能,全文索引将超过同类搜索