MATCH AGAINST работает не совсем так, как вы думаете.
Кейси Фултон может суммировать это как «... FULLTEXT ищет только [возвращать] что-либо, если число результатов меньше 50% от общего размера таблицы ...»
Так что вместо этого я ищу все LIKE, а затем отфильтровываю точные слова по REGEX. Я делаю это, чтобы сократить нагрузку на REGEX.
Вот мое решение:
$likerows = "(SELECT * FROM `tweets` WHERE text LIKE '%$q%') AS likerows ";
$regexrows = "(SELECT * FROM $likerows WHERE text REGEXP('^.* $q .*$')) AS regexrows ";
$query = "SELECT * FROM $regexrows ";
Я поставил пробелы вокруг $ q, потому что я хочу сопоставить слово, структурированное по предложению (перед которым следует пробел).
Кроме того, я ищу слова, начинающиеся с $. Это была проблема, и вот что я сделал, чтобы решить эту проблему:
if(substr($q, 0, 1) == '$') $q = '\\\\' . $q; // you have to escape the backslash that escapes the $ -- it's nuts.
Удачи.