Я пытаюсь найти точные слова, и мои исследования не помогают мне.
Решения, которые я нашел:
$query .= "WHERE text REGEXP '[[:<:]]($word)[[:>:]]'";
// OR
$query .= "WHERE MATCH(text) AGAINST('$word') ";
но не возвращаются мои совпадения.
Я ищу символы запаса в моем db (например, $aapl
). И использование LIKE '%$word%'
вернет $bac
, если вы выполните поиск $ba
.
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 nuts.
Желаем удачи.
Вы хотите использовать MySql Full Text Search, чтобы выполнить то, что вы описали выше.
Наслаждайтесь!