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

标签 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*"' )

这是为什么? 我正在为我的搜索词使用解析器,这会添加通配符 *

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

提前致谢

最佳答案

该问题是由于 1) 使用中性语言 2) 加上全文索引的非索引字表 3) 加上在包含停用词的搜索中使用通配符时出现的意外行为造成的。

中性语言并没有涵盖英语的所有细微差别,因此在索引时它会考虑 O'neill是 2 个单独的词 Oneill 。那么你的非索引字表会考虑 O作为停用词,因此该“单词”不会添加到索引中,仅添加 neill是。

在搜索时,搜索引擎通常会忽略多词短语中的停用词。例如,搜索 Contains(*, '"we x people"')将匹配文本 ...we the people... , xthe两者都是停用词,因此会自动彼此“匹配”。 (我宽松地使用术语“匹配”,因为搜索引擎不匹配停用词,而是它知道 people 距离 we 1 个单词。)

所以您可能会期望通配符搜索 Contains(*, '"we the people*"')也可以找到它的匹配项,除了使用非索引字表时不会找到。如果不是停用词the在搜索短语中,或者 if the不被视为停用词,搜索会正常进行。我真的无法解释这种行为,但我怀疑它与单词位置的计算方式有关。我也怀疑这不是预期的行为。

回到你的案例,Contains(*, '"Test O''neill 123"')会找到匹配项,但通配符搜索 Contains(*, '"Test O''neill 123*"')才不是。 (您甚至可以将搜索简化为 Contains(*, '"O''neill*"'),您会发现它仍然找不到匹配项。)停用词 O 的组合使用通配符会遇到我在上一段中解释的问题。这就是您问题中所述问题的症结所在。

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

1) 将全文索引的语言更改为英语并重新索引。这将导致O'neill被视为 1 个单词,因此您将避免我解释的奇怪的通配符行为。您可以通过 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) 如果您需要继续使用中性语言,请考虑删除 O从您的非索引字表中删除并重新索引。

ALTER FULLTEXT STOPLIST MyStoplist DROP 'o' LANGUAGE 'Neutral';

3) 或者,如果不需要,请不要使用非索引字表。

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

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

关于sql-server - 全文搜索 - 包含加通配符和单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32404842/

相关文章:

c# - TransactionScope TransactionAborted 异常 - 事务未回滚。应该吗?

sql - 如何保护 SQL Server 存储过程

javascript - 如何使用 ydn-db-fulltext 为数组中的子对象属性建立索引?

Java 泛型 : Wildcard capture misunderstanding

sql - 从数据库中提取值 > 1.00

c# - 如果插入一条记录失败,删除所有先前插入的行,是否可以在事务中进行?

php - 转换用于 MySQL FULLTEXT bool 模式的多词搜索字符串

sql-server - 为什么我的全文搜索没有结果?

java - 使用包含小数的数字通配符检查文件夹是否存在

java - 泛型类型和通配符类型的区别