全文搜索前缀搜索问题

时间:2016-02-17 10:00:48

标签: sql sql-server sql-server-2012 full-text-search

我有一个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 运算符。

赞赏任何形式的帮助/建议,

1 个答案:

答案 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"'时获得额外的结果,因为全文搜索引擎将HJ匹配,因为它们都是停用词。

你的Q1解释起来有点棘手。由于我从未理解的原因,跨多个字符串(包括停用词和通配符)的全文搜索有时会产生不可预测的结果。这是您搜索'"393033-H-X02.1*"'时发生的情况。我希望我能更好地解释它,但我不知道具体原因。但是,禁用停止列表可以防止此问题发生。