Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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_Full Text Search_Wildcard_Wordbreaker - Fatal编程技术网

Sql server 全文搜索-包含加通配符和单引号

Sql server 全文搜索-包含加通配符和单引号,sql-server,full-text-search,wildcard,wordbreaker,Sql Server,Full Text Search,Wildcard,Wordbreaker,我有一个带有名称字段的表 Test O'neill 123 如果我使用 SELECT * FROM table F WHERE CONTAINS ( F.*, '"Test O''neill 123"' ) 它工作正常,但如果使用通配符*,则不会得到任何结果 SELECT * FROM table f WHERE CONTAINS ( F.*, '"Test O''neill 123*"' ) 为什么会这样? 我正在为搜索词使用解析器

我有一个带有名称字段的表

Test O'neill 123
如果我使用

SELECT  *
    FROM    table F
    WHERE   CONTAINS ( F.*, '"Test O''neill 123"' )
它工作正常,但如果使用通配符
*
,则不会得到任何结果

SELECT  *
    FROM    table f
    WHERE   CONTAINS ( F.*, '"Test O''neill 123*"' )
为什么会这样? 我正在为搜索词使用解析器,这是在添加通配符
*

我检查了一些网站,关于逃离
,但我没有找到任何与此相关的内容


提前感谢

问题是由于1)使用中性语言2)加上全文索引的停止列表3)加上在包含停止词的搜索中使用通配符时的意外行为

中性语言并没有涵盖英语的所有细微差别,因此在索引时,它认为
O'neill
是两个独立的单词
O
neill
。然后,您的停止列表将
O
视为停止词,因此该“词”不会添加到索引中,只有
neill

在搜索时,搜索引擎通常会忽略多词短语中的停止词。例如,搜索
包含(*,“'we x people””)
将匹配文本
…we the people…
x
这两个词都是停止词,因此会自动“匹配”彼此。(我松散地使用术语“匹配”,因为搜索引擎没有匹配停止词,而是知道
距离
我们
只有一个词)

因此,您可能希望通配符搜索
包含(*,“‘我们这些人*”)
也能找到匹配项,但在使用停止列表时没有。如果不是搜索短语中的stopword
the
,或者如果
the
未被视为stopword,则搜索将正常工作。我真的无法解释这种行为,但我怀疑它与单词位置的计算方式有关。我也怀疑这不是故意的行为

因此回到您的案例,
Contains(*,“'Test O'neill 123]”
将找到匹配项,但通配符搜索
Contains(*,“'Test O'neill 123*”)
不会找到匹配项。(您甚至可以将搜索简化为
包含(*,“'O''neill*”)
,您会发现它仍然没有找到匹配项。)stopword
O
与通配符的组合遇到了我在上一段中解释的问题。这就是你问题的症结所在

解决方案从最有效到最无效,但可能更适合您的情况:

1) 将全文索引中的语言更改为英语并重新索引。这将导致
O'neill
被视为一个单词,因此您将避免我解释的奇怪的通配符行为。您可以通过SQL Server Management Studio更改全文索引属性中的语言,或按如下方式删除并重新创建索引:

ALTER FULLTEXT INDEX ON MyTable DROP (Column1) 
GO
ALTER FULLTEXT INDEX ON MyTable ADD (Column1 LANGUAGE [English])
-- repeat for each column in the index

2)如果需要继续使用中性语言,请考虑从StPultReals/Reindex中删除<代码> o>代码>

ALTER FULLTEXT STOPLIST MyStoplist DROP 'o' LANGUAGE 'Neutral';
3) 或者,如果你不需要,不要使用停止列表

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

< P > 4)如果上述解决方案都不实用,请考虑从搜索短语中删除停用词,或至少在姓氏中使用<代码> O '//>前缀。

您正在正确地逃离<代码> <代码>。我无法用SQL Server 2014重现此问题。您使用的是什么版本?sql server 14也是。。可能是关于排序规则或语言?我对此毫无头绪,我不是dba,只是一个普通的开发人员,所以我不确定该去哪里看..不确定。如果有帮助的话,我正在使用排序规则SQL\u Latin1\u General\u CP1\u CI\u AS,语言是英语。我发现撇号是一个分词符,所以我不能使用通配符,只能使用完全匹配的字符。您使用自定义的禁止列表吗?名称字段的数据类型和大小是什么?文本是否准确地存储为
Test O'neill 123
,或者这是较长字符串的一部分?