在MySQL全文搜索中忽略&符号的HTML实体

时间:2010-08-27 10:28:10

标签: mysql full-text-search html-entities

我有很多数据正在使用HTML实体&输入到记录中。对“amp”一词进行全文搜索会导致显示包含&的记录,这是非常不受欢迎的。

据推测这是因为MySQL忽略了'&amp;'和';'。所以有人知道MySQL中的任何方式强制它将特殊字符作为单词的一部分处理,以便我对“amp”的搜索不包括&amp;中的所有结果 - 理想情况下不带< / strong>某种形式的子查询或额外的WHERE子句?

到目前为止我的解决方案(尚未实现)是在INSERT上解码实体并在Web上显示时重新编码它们。这样可以,但如果可能的话,我会尽量避免一些开销。它也适用于新条目,但我需要将它回溯到近700万条记录......如果我能帮助它,我有点不想 做。

-

我使用以下内容更新了my.cnf文件:

ft_stopword_file = /etc/mysql/custom-stopwords

是否需要对此文件有任何特殊权限?

3 个答案:

答案 0 :(得分:2)

你的“在INSERT上解码HTML实体并在输出上对它们进行编码”是你最好的选择,它也会照顾&quot;之类的东西。您可能希望在此过程中删除HTML标记,以防止MySQL在属性值中查找内容。

如果速度和格式是一个问题,那么你可以将text / plain版本填充到一个单独的列中,并将全文索引放在其上,让其他所有内容使用text / html版本。当然,您必须同时维护两个列,并且您的存储要求会上升; OTOH,这种方法可以让您在索引中添加标签,作者姓名和其他额外的有趣数据,而不会弄乱您显示的文本。

与此同时,在将ft_stopword_file添加到配置文件后,是否重建了全文索引? AFAIK,在进入索引的途中应用了停用词,而不是在查阅索引时使用。

答案 1 :(得分:0)

也许你需要特别忽略这些。尝试将-&amp;包含在您的全文查询中。另一个选项,我不确定它是否需要更改MySql源代码是将amp和&amp;添加到MySql的停用词列表

答案 2 :(得分:0)

您已将其添加到停用词文件中,但它无效?听起来像MySQL中的错误或你的停用词列表没有被使用。你看过this了吗?引用:

  

可能会发生虚假命中或未命中   停用词查找是否为禁用词文件   或用于全文索引的列   或搜索有字符集或   整理不同于   character_set_server或   collat​​ion_server的。

     

禁用词查找的区分大小写   取决于服务器排序规则。对于   例如,查找不区分大小写   如果整理是latin1_swedish_ci,   而查找是区分大小写的,如果   整理是latin1_general_cs或   latin1_bin。

这些可能性中的任何一种都可能影响你的&amp; amp;没被读过?