【问题标题】:MySQL Fulltext search against column value?MySQL全文搜索对列值?
【发布时间】:2011-01-01 23:02:21
【问题描述】:

我需要对另一个表中的一列中的一大堆值进行全文搜索。由于 MATCH() 需要 AGAINST() 部分中的值,因此直截了当:“SELECT a.id FROM a,b WHERE MATCH(b.content) AGAINST(a.name)”失败并显示“AGAINST 参数不正确”。

现在,我知道我可以编写一个脚本来查询姓名列表,然后搜索它们,但我更愿意制定一个更复杂的查询,可以一次处理所有这些。它也不需要很快。

想法?

谢谢

【问题讨论】:

    标签: mysql full-text-search


    【解决方案1】:

    不幸的是,http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html 说:

    搜索字符串必须是在查询评估期间保持不变的字符串值。例如,这会排除表格列,因为每行的列可能不同。

    如果您使用 MySQL 的 FULLTEXT 索引作为搜索解决方案,您似乎必须一次搜索一个模式。

    我能想到的允许搜索您所​​描述的许多模式的唯一替代方法是倒排索引。虽然这不像真正的全文搜索技术那样灵活或可扩展。

    查看我的演示文稿http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql

    【讨论】:

    • 是的,我已经看到了,但是dev.mysql.com/tech-resources/articles/full-text-revealed.html 说“”AGAINST() 的参数必须是一个常量字符串。”这没什么好担心的。我们只是还没有更新如果您使用 MySQL 版本 5,手册尚未显示 AGAINST() 参数可以是变量或参数。”我希望有人会使用某种更复杂的 sql 方法(视图、过程或其他东西)得到一些建议。实际上,我要做的基本上是在表 b 的文本列中从表 a 中构建术语的倒排索引。
    • 那篇文章是 2004 年 5 月的,但他们仍然没有更新手册?!太可怜了!
    • 说一下全文对mysql的重要性,我想。我最近发现自己在研究 Squid,但这是一个项目的一个侧面,我真的无意进行系统性的改变。
    • @LightnessRacesinOrbit,感谢您的更正。我已经编辑了上面的内容以匹配该错误日志中提到的手动更新。虽然这与这里的原始问题没有区别——OP 仍然不能使用列名作为 AGAINST() 的参数。你可以考虑撤销你的反对票吗?
    • @BillKarwin:我当然可以:)
    【解决方案2】:

    希望我的解决方案对你有用:

    PREPARE stat FROM 'SELECT user_profession FROM users INNER JOIN professions ON MATCH(user_profession) AGAINST (?)';
    SET @c_val = (SELECT prfs_profession FROM professions WHERE prfs_ID=1);
    EXECUTE stat USING @c_val;
    

    【讨论】:

    • 我认为这没有帮助,这基本上是在准备好的语句中将值作为命名参数传递,问题是关于在一个查询中根据列值传递不同的值.. 谢谢你非常努力
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2010-10-22
    • 2015-07-03
    相关资源
    最近更新 更多