2016-02-17 173 views
0

我有一个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 - 现在,当我做这样的搜索,我没有得到任何数据(注意STAR AT THE END )。

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

如果过滤,LIKE变得如何变慢? ,你的桌子上有多少数据? – Japongskie

+0

超过1000万 –

+0

哦,我明白了,你有没有提出适当的指数? – Japongskie

回答

1

您正在使用您的全文索引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*"'时发生的情况。我希望我能更好地解释它,但我不知道确切的原因。但是,禁用停止列表将防止发生此问题。

+0

感谢那么多,忘记阅读'重建索引'的精美版本。现在效果很好 –