【问题标题】:Ignoring HTML entity for ampersand in MySQL Full-Text Search在 MySQL 全文搜索中忽略 & 符号的 HTML 实体
【发布时间】:2011-04-04 17:44:45
【问题描述】:

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

这大概是因为 MySQL 忽略了 '&' 和 ';'。那么有人知道在 MySQL 中有什么方法可以强制它把特殊字符当作单词的一部分,这样我对“amp”的搜索就不会包括所有带有& 的结果——理想情况下是没有 某种形式的子查询或额外的 WHERE 子句?

到目前为止,我的解决方案(尚未实现)是对 INSERT 上的实体进行解码,并在 Web 上显示时对其重新编码。这没关系,但如果可能的话,我想避免的一切都会增加一些开销。它也适用于新条目,但我需要将其回溯到近 700 万条记录...如果我能提供帮助,我有点不想必须这样做。

--

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

ft_stopword_file = /etc/mysql/custom-stopwords

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

【问题讨论】:

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


    【解决方案1】:

    您的“在 INSERT 上解码 HTML 实体并在输出时对其进行编码”是您最好的选择,这也将处理诸如 " 之类的事情。在此过程中,您可能还想去掉 HTML 标记,以防止 MySQL 在属性值中查找内容。

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

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

    【讨论】:

    • 经过深思熟虑,我觉得解码实体并将它们存储在单独的列中是我最好的选择。就内存而言,它是最灵活的,即使不是最便宜的选择……一种允许的副作用我认为
    【解决方案2】:

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

    【讨论】:

    • 谢谢阿什利。看看在我的 MATCH-AGAINST 声明中添加 -& 和在停用词列表中添加 & 之间是否存在性能差异会很有趣。我会试一试的!
    • 我将它添加到停用词文件中,但不幸的是它没有任何影响。我不能将它添加到我的查询中,因为我不希望它影响包含它的结果 amp 和 &...
    【解决方案3】:

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

    可能会发生错误命中或未命中 停用词查找,如果停用词文件 或用于全文索引的列 或搜索具有字符集或 整理不同于 character_set_server 或 collat​​ion_server。

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

    这些可能性中的任何一种是否会影响您输入 & 的停用词?没有被阅读?

    【讨论】:

    • 这也是指向停用词文件的 my.cnf 配置值的描述。最好回顾一下,以确保您在设置停用词列表时没有遗漏任何内容。 dev.mysql.com/doc/refman/5.1/en/…
    • 谢谢约书亚。在阿什利的建议之后,我大部分都遵循了这封信,但我没有成功。我已经更新了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多