2010-08-27 69 views
4

我有很多數據被輸入到HTML實體&的記錄中。全文搜索單詞「amp」將導致顯示包含&的記錄,這是非常不希望的。忽略MySQL中與&符號的HTML實體全文搜索

大概這是因爲MySQL忽略'&'和';'。因此,任何人都不知道MySQL內的任何方式來強制它將特殊字符作爲單詞的一部分來對待,以便我對「amp」的搜索不包括其中包含&的所有結果 - 理想情況下沒有某種形式的子查詢或額外WHERE子句?

我到目前爲止的解決方案(尚未實現)是解碼INSERT上的實體,並在網絡上顯示時對它們進行重新編碼。這樣可以,但是如果可能的話,我會盡量避免一些額外開銷。此外,它適用於新的條目,但我需要將其備份到近700萬條記錄......我不想要做,如果我可以幫助它。

-

我更新了我的my.cnf文件有以下幾點:

ft_stopword_file = /etc/mysql/custom-stopwords 

是否有必須在這個文件中的任何特殊權限?

回答

2

您的「在INSERT上解碼HTML實體並在輸出端對它們進行編碼」是最好的選擇,那麼您也可以考慮"之類的東西。你可能想要去掉HTML標籤,以防止MySQL在屬性值中找到東西。

如果速度和格式是一個問題,那麼你可以將文本/純文本填充到單獨的列中,並將全文索引放在該文本上,並讓所有其他文本使用text/html版本。當然,你必須同時維護兩個列,並且你的存儲需求會增加; OTOH,這種方法可以讓你添加標籤,作者姓名和其他一些有趣的數據到索引而不會搞亂你的顯示文本。

與此同時,在將ft_stopword_file添加到配置文件後,是否重建了全文索引? AFAIK,停用詞在進入索引時應用,而不是在查詢索引時應用。

+0

經過多方考慮和深思熟慮之後,我覺得解碼實體並將它們存儲在單獨的列中是我最好的選擇。它是最靈活的,即使不是內存方面最便宜的選擇......也是一種可允許的副作用檢測方法 – simonhamp 2010-12-23 18:03:26

0

也許你需要特別忽略這些。嘗試將-&添加到您的全文查詢中。另一種選擇,我不確定是否需要MySql源代碼更改是將放大器和&添加到MySql的停用詞列表中

+0

謝謝阿什利。如果在我的MATCH-AGAINST聲明和'&'之間添加' - &'到停用詞列表之間是否存在性能差異,將會很有趣。我會放棄它! – simonhamp 2010-08-27 22:43:55

+0

我將它添加到停用字詞文件中,但不幸的是它沒有任何影響。我不能將它添加到我的查詢中,因爲我不希望它影響包含'amp'和'&'的結果...... – simonhamp 2010-10-01 10:23:24

0

您已將其添加到停用詞文件並且它不工作?聽起來像是MySQL中的一個錯誤,或者你的停用詞表沒有被使用。您查看過this嗎?報價:如果用於全文索引 或搜索停止字文件 或列有一個字符集或整理 從 被character_set_server或 collat​​ion_server的不同的 禁用詞查找可能發生

假命中或遺漏。

停用詞查找的大小寫敏感性 取決於服務器排序規則。例如,對於 示例,如果排序規則爲latin1_swedish_ci, ,則查找不區分大小寫 ,而如果 排序規則爲latin1_general_cs或 latin1_bin,則查找區分大小寫。

這些可能性中的任何一個都會影響您的停止字詞條目& amp;不被閱讀?

+0

這裏也是對my.cnf配置值的描述,指向停用詞文件。最好審查一下,以確保您在設置停用詞列表時不會錯過任何內容。 http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_ft_stopword_file – Josh 2010-10-01 14:04:45

+0

謝謝Joshua。在阿什利的建議之後,我把大部分內容都寫在了這封信上,而且我還沒有成功。我已經更新了我的問題 – simonhamp 2010-10-01 20:59:05