我有一个SQL Server 2012安装和很少的全文索引列。
现在我很少有全文索引列,我正在进行CONTAINS()
搜索。
所以我的表有各种数据
“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 - 现在当我进行这样的搜索时,我获取了我的任何数据,但它也返回“393033-J-X02.1”
SELECT * FROM tblMyData where MyFullTextCoulm CONTAINS ('"393033-H-X02.1"')
我一直在阅读文档,我知道 PREFIX 在 SQLServer全文中搜索,但它与我看到的内容并不相关。
我只需要找到行,我可以在该列的任何位置找到该确切的单词,尝试过非常慢的 LIKE 运算符。
赞赏任何形式的帮助/建议,
答案 0 :(得分:2)
您在全文索引中使用了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*"'
时发生的情况。我希望我能更好地解释它,但我不知道具体原因。但是,禁用停止列表可以防止此问题发生。