首页 > 解决方案 > 针对多个 %term% 的 MyIsam 全文搜索

问题描述

我有一个名为 filepath 的字段,我正在尝试搜索。这是一个示例路径:

/mnt/qfs-X/Asset_Management/XG_Marketing_/Episodic-SG_1001_1233.jpg

我希望能够搜索以下内容并获得匹配项:

search = "qf episodic sg_1001 JPG"

我将如何在 mysql/myisam 中进行全文搜索?我现在拥有的是:

SELECT * FROM x_files2 WHERE MATCH(path)
AGAINST('qf episodic sg_1001 JPG' in boolean mode)

但是它返回的结果太多了(如果找到任何术语,而不是仅找到所有术语,它似乎就会返回。

标签: mysqlsqlsearchfull-text-searchmyisam

解决方案


放在+每个“单词”的前面:

AGAINST('+qf* +episodic +sg_1001* +JPG' in boolean mode)

您是否将最小字长设置为 2?如果没有,可能还有其他麻烦。

避免“+太多”。

考虑切换到 InnoDB,因为它有FULLTEXT.

您可能不得不放弃使用 FULLTEXT 并切换到LIKE

WHERE path LIKE '%qf%episodic%sg_1001%JPG%'

如果性能是一个问题,请考虑类似

WHERE MATCH(path) AGAINST('...' IN BOOLEAN MODE)  -- using some of the words
  AND path LIKE '...'   -- as above

MATCH首先运行,大大减少可能的行数,然后LIKE处理细节。

请注意,单词的中间不能用于AGAINST. 那些可以被排除在外,依靠LIKE照顾他们。


推荐阅读