2013-07-01 4 views
5

Сейчас я использую следующие действия MySQL QueryMySQL полнотекстового поиска не возвращающие наиболее релевантные результаты первых

SELECT * FROM songs WHERE MATCH (title,artist) AGAINST ('$ser' IN BOOLEAN MODE) 

Сейчас он работает, но не очень хорошо.

Например у меня есть следующие термины в моей базе данных

Term One 
Term Two 
Term Three 

и я делаю поиск термина Три

$ser = 'Term Three' 

это просто возвращающийся

Term One 
Term Two 
Term Three 

Так что это соответствие Термин, но это не дает Термину Три более высокий приоритет, имеющий как Термин, так и Три, и я не уверен, что чтобы заставить его казаться над другими.

Надеюсь, что имеет смысл.

ответ

3

С таблицами MyISAM «три» по умолчанию являются stopword, поэтому он не индексируется и игнорируется во всех поисках.

Если вы действительно используете таблицы MyISAM, то вы можете указать свой собственный список остановок или полностью отключить эту функцию с помощью сервера ft_stopword_file (MyISAM).

NB: Для таблиц InnoDB innodb_ft_server_stopword_table есть возможность поиска. «Три», по-видимому, не являются по умолчанию для InnoDB, но список стоп-слов может отличаться на вашем сервере.


[править]

Я полностью упускается из виду, что булевы поиски do not sort results automatically по релевантности (как естественные поиски языка делают). Все, что вам нужно сделать, это добавить ORDER BY пункта (пожалуйста test it here):

SELECT * FROM songs WHERE MATCH (title,artist) AGAINST ('$ser' IN BOOLEAN MODE) 
ORDER BY MATCH (title,artist) AGAINST ('$ser' IN BOOLEAN MODE) DESC 
+0

это просто пример, фактические условия не содержат стоп-слова и приносят одни и те же результаты. –

+0

@BelginFish Во-вторых, я думаю, что все, что вам нужно сделать, это добавить предложение 'ORDER BY'. Просмотрите мое редактирование. – RandomSeed

+0

Спасибо, что ты работал как шарм :) –

Смежные вопросы