全文搜索前缀搜索问题
Full Text Search Prefix Search problems
我有一个 SQL Server 2012 安装和几个全文索引列。
现在,我正在执行 CONTAINS()
搜索的几个全文索引列。
所以我的 table 有各种数据
"393033-H-X02.1", "393033-H-X03.1", "393033-J-X02.1",
"393033-J-X03.1", "393033-J-X04.1"
Q1 - 现在当我进行这样的搜索时,我没有得到任何数据(注意末尾的星星)。
SELECT * FROM tblMyData where MyFullTextCoulm CONTAINS ('"393033-H-X02.1*"')
Q2 - 现在当我进行这样的搜索时,我得到了我的所有数据,但它也 return“393033-J-X02.1”
SELECT * FROM tblMyData where MyFullTextCoulm CONTAINS ('"393033-H-X02.1"')
我一直在阅读文档,我知道 PREFIX 在 SQLServer full text 中搜索,但是它与我看到的不相关。
我只需要找到可以在该列的任何位置找到确切单词的行,尝试了非常慢的 LIKE 运算符。
任何类型的 help/suggestion 都表示赞赏,
您在全文索引中使用了 stoplist,这是导致问题的原因。如果您将全文索引配置为不使用非索引字表,然后重建索引,您的查询将产生您期望的结果。
非索引字表如何影响您的查询?首先,一些背景。诸如 393033-H-X02.1
之类的字符串在编制索引时会分成单独的字符串,例如:393033
+ H
+ X02
+ 1
。因此,当您搜索 '"393033-H-X02.1"'
时,您实际上是在搜索多个词,就像搜索 '"this is a sentence"'
.
一样
您的非索引字表不包括单个字母 (H
) 和单个数字 (1
)。这些词在全文搜索中会被忽略,所以 '"393033-H-X02.1"'
就像搜索 '"393033-*-X02.*"'
,其中 *
只匹配停用词。这就是为什么,根据您的 Q2,您在搜索 '"393033-H-X02.1"'
时会得到额外的结果,因为全文搜索引擎将 H
与 J
匹配,因为它们都是停用词。
您的 Q1 解释起来有点棘手。出于我从未理解的原因,跨多个字符串(包括停用词和通配符)的全文搜索有时会产生不可预测的结果。这就是您搜索 '"393033-H-X02.1*"'
时发生的情况。我希望我能更好地解释它,但我只是不知道确切的原因。但是,禁用非索引字表将防止此问题发生。
我有一个 SQL Server 2012 安装和几个全文索引列。
现在,我正在执行 CONTAINS()
搜索的几个全文索引列。
所以我的 table 有各种数据
"393033-H-X02.1", "393033-H-X03.1", "393033-J-X02.1", "393033-J-X03.1", "393033-J-X04.1"
Q1 - 现在当我进行这样的搜索时,我没有得到任何数据(注意末尾的星星)。
SELECT * FROM tblMyData where MyFullTextCoulm CONTAINS ('"393033-H-X02.1*"')
Q2 - 现在当我进行这样的搜索时,我得到了我的所有数据,但它也 return“393033-J-X02.1”
SELECT * FROM tblMyData where MyFullTextCoulm CONTAINS ('"393033-H-X02.1"')
我一直在阅读文档,我知道 PREFIX 在 SQLServer full text 中搜索,但是它与我看到的不相关。
我只需要找到可以在该列的任何位置找到确切单词的行,尝试了非常慢的 LIKE 运算符。
任何类型的 help/suggestion 都表示赞赏,
您在全文索引中使用了 stoplist,这是导致问题的原因。如果您将全文索引配置为不使用非索引字表,然后重建索引,您的查询将产生您期望的结果。
非索引字表如何影响您的查询?首先,一些背景。诸如 393033-H-X02.1
之类的字符串在编制索引时会分成单独的字符串,例如:393033
+ H
+ X02
+ 1
。因此,当您搜索 '"393033-H-X02.1"'
时,您实际上是在搜索多个词,就像搜索 '"this is a sentence"'
.
您的非索引字表不包括单个字母 (H
) 和单个数字 (1
)。这些词在全文搜索中会被忽略,所以 '"393033-H-X02.1"'
就像搜索 '"393033-*-X02.*"'
,其中 *
只匹配停用词。这就是为什么,根据您的 Q2,您在搜索 '"393033-H-X02.1"'
时会得到额外的结果,因为全文搜索引擎将 H
与 J
匹配,因为它们都是停用词。
您的 Q1 解释起来有点棘手。出于我从未理解的原因,跨多个字符串(包括停用词和通配符)的全文搜索有时会产生不可预测的结果。这就是您搜索 '"393033-H-X02.1*"'
时发生的情况。我希望我能更好地解释它,但我只是不知道确切的原因。但是,禁用非索引字表将防止此问题发生。