我有很多数据正在使用HTML实体&
输入到记录中。对“amp”一词进行全文搜索会导致显示包含&
的记录,这是非常不受欢迎的。
据推测这是因为MySQL忽略了'&'和';'。所以有人知道MySQL中的任何方式强制它将特殊字符作为单词的一部分处理,以便我对“amp”的搜索不包括&
中的所有结果 - 理想情况下不带< / strong>某种形式的子查询或额外的WHERE子句?
到目前为止我的解决方案(尚未实现)是在INSERT上解码实体并在Web上显示时重新编码它们。这样可以,但如果可能的话,我会尽量避免一些开销。它也适用于新条目,但我需要将它回溯到近700万条记录......如果我能帮助它,我有点不想 做。
-
我使用以下内容更新了my.cnf
文件:
ft_stopword_file = /etc/mysql/custom-stopwords
是否需要对此文件有任何特殊权限?
答案 0 :(得分:2)
你的“在INSERT上解码HTML实体并在输出上对它们进行编码”是你最好的选择,它也会照顾"
之类的东西。您可能希望在此过程中删除HTML标记,以防止MySQL在属性值中查找内容。
如果速度和格式是一个问题,那么你可以将text / plain版本填充到一个单独的列中,并将全文索引放在其上,让其他所有内容使用text / html版本。当然,您必须同时维护两个列,并且您的存储要求会上升; OTOH,这种方法可以让您在索引中添加标签,作者姓名和其他额外的有趣数据,而不会弄乱您显示的文本。
与此同时,在将ft_stopword_file
添加到配置文件后,是否重建了全文索引? AFAIK,在进入索引的途中应用了停用词,而不是在查阅索引时使用。
答案 1 :(得分:0)
也许你需要特别忽略这些。尝试将-&
包含在您的全文查询中。另一个选项,我不确定它是否需要更改MySql源代码是将amp和&
添加到MySql的停用词列表
答案 2 :(得分:0)
您已将其添加到停用词文件中,但它无效?听起来像MySQL中的错误或你的停用词列表没有被使用。你看过this了吗?引用:
可能会发生虚假命中或未命中 停用词查找是否为禁用词文件 或用于全文索引的列 或搜索有字符集或 整理不同于 character_set_server或 collation_server的。
禁用词查找的区分大小写 取决于服务器排序规则。对于 例如,查找不区分大小写 如果整理是latin1_swedish_ci, 而查找是区分大小写的,如果 整理是latin1_general_cs或 latin1_bin。
这些可能性中的任何一种都可能影响你的&amp; amp;没被读过?