MATCH AGAINST和REGEXP的组合

时间:2015-11-09 08:25:10

标签: mysql regex

SELECT *,
       MATCH (name,
              tag) AGAINST ('keyword1 keyword2') AS accurat
FROM table_company
WHERE (name REGEXP 'keyword1 | keyword2'
       OR tag REGEXP 'keyword1 | keyword2')
  AND apg_status=1
ORDER BY accurat DESC

upper是我的搜索查询。谁能告诉我这是一个好习惯?因为我想按字搜索并按结果的准确性排序。

1 个答案:

答案 0 :(得分:1)

你所拥有的将会非常缓慢 - ORREGEXP都很慢;所有行都将进行繁琐的扫描。

MATCH...子句中使用WHERE代替or + regexp。

如果MATCH需要进一步细化......(例如,MATCH行数过多,LIKEREGEXP可能会过滤掉一些内容。 )然后做

WHERE MATCH ...
  AND ((other filtering conditions))

这是有效的,因为优化器总是(?)优先于FULLTEXT部分而不是另一部分。并且FULLTEXT LIKEREGEXP更快。

ORDER BY accurat DESC - 这没关系,但你可能会对它选择的顺序嗤之以鼻。太糟糕了;它就是它。

旁注...如果您使用InnoDB的FULLTEXT,则需要删除任何太短或在禁用词列表中的'字词'。否则MATCH将失败。 (这是MyISAM的变化。)