У меня в таблице есть 3 поля в MySQL. Мне нужно искать строку, используя PHP. Мой код похож на
<?PHP //SET THE SEARCH TERM $term = "Search Term"; //QUERY THE TITLE AND CONTENT COLUMN OF THE PAGES TABLE RANK IT BY THE SCORE $sql = "SELECT *, MATCH(title, content) AGAINST('". $term ."') as score FROM pages WHERE MATCH (title, content) AGAINST('". $term ."') ORDER BY score DESC"; $query = mysql_query($sql); //BUILD A LIST OF THE RESULTS while($result = mysql_fetch_assoc($query)) { echo("{$result['title']} - {$result['score']}"); } ?>
Здесь он искал единственное слово, которое находится именно в базе данных. Мне нужно найти несколько слов … Как изменить код выше. Может кто-то предложить какую-то идею.
MATCH (title,content) AGAINST ('Search Term' IN BOOLEAN MODE)
будет искать одно из слов
MATCH (title,content) AGAINST ('+Search +Term' IN BOOLEAN MODE)
будет искать оба слова
MATCH (title,content) AGAINST ('-Search +Term' IN BOOLEAN MODE)
будет искать Термин без поиска
просто разделите слова и постройте их с помощью + – | , независимо от того, что необходимо.
проверьте документацию по адресу : http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
Вы можете просто добавить логический переключатель режима в соответствие – но это не сортирует результаты по релевантности.
Вы могли бы попробовать что-то вроде …..
$words=explode(' ', $term); $score='CASE '; $filter=array(); foreach ($words as $try_word) { $score.="WHEN MATCH(title, content) AGAINST('$try_word') THEN 1 "; $filter[]="MATCH(title, content) AGAINST('$try_word')"; } $score.="ELSE 0 END CASE"; $qry="SELECT SUM(SCORE), " . ** add explicit list of fields here ** . " FROM pages WHERE (" . implode(' OR ', $filter) . ")" . " GROUP BY " . ** add explicit list of fields here ** . " ORDER BY 1 DESC";
Обратите внимание, что это подчеркивает проблему, заключающуюся в том, что полнотекстовый поиск в mysql не является идеальным решением проблемы. Лучшим подходом является реализация отдельной таблицы извлеченных ключевых слов и временного набора поисковых слов и выполнение запроса по всем трем таблицам:
SELECT COUNT(*) as matched_fields, " . ** add explicit list of fields from page table here ** . " FROM pages p, keywords k, search_terms s WHERE k.word=s.word AND s.session_id='" . some_session_or_request_identifier() . "' AND k.page_id=p.id GROUP BY " . ** add explicit list of fields from page table here ** . " ORDER BY 1 DESC
В дополнение к простому упрощению кода и разрешению очень больших наборов поисковых запросов, но эффективному поиску, вы можете отбросить значения релевантности в таблицу ключевых слов и использовать их для создания оценки.