2016-02-17 211 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

感謝那麼多,忘記閱讀'重建索引'的精美版本。現在效果很好 –