针对列值的MySQL全文搜索?

12

我需要对另一张表的一个列中的大量值进行全文搜索。由于MATCH()需要AGAINST()部分中的一个值,因此直接使用"SELECT a.id FROM a,b WHERE MATCH(b.content) AGAINST(a.name)"这样的查询将会失败并显示"Incorrect arguments to AGAINST"。

我知道可以编写脚本来查询名称列表,然后再搜索它们,但我更愿意想出一个更复杂的查询,可以一次性处理所有内容。它不需要速度很快。

有什么想法吗?

谢谢!

2个回答

5
很遗憾,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

1
是的,我看过了,但是http://dev.mysql.com/tech-resources/articles/full-text-revealed.html说:“AGAINST()的参数必须是一个常量字符串。”这没什么好担心的。我们只是还没有更新手册,以显示AGAINST()参数可以是变量或参数,如果您使用MySQL版本5的话。我希望有人能提供一些使用某种更复杂的SQL方法(视图、存储过程或其他东西)的建议。实际上,我要做的基本上是从表a中构建一个出现在表b文本列中的术语的倒排索引。 - Eric B
1
那篇文章是2004年五月的,但他们仍然没有更新手册?这太可悲了! - Bill Karwin
这段内容似乎在谈论全文搜索在MySQL中的重要性。最近我一直在学习Squid,但这只是项目的一部分,我并没有打算进行系统性的改变。 - Eric B
@LightnessRacesinOrbit,感谢您的纠正。我已经编辑了上面的内容,以匹配该错误日志中提到的手动更新。虽然这对于原始问题没有任何影响 - OP仍然无法将列名用作AGAINST()的参数。您能考虑撤销您的反对票吗? - Bill Karwin
@BillKarwin: 我当然可以 :) - Lightness Races in Orbit

0

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

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;

我认为这并没有什么帮助,这基本上是将值作为命名参数传递到准备好的语句中,问题是在一个查询中根据列值传递不同的值..非常感谢你的努力。 - Mohammed R. El-Khoudary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接