PHP MySQL Поиск И Упорядочивание По Релевантности
Я знаю, как выполнять обычный поиск php в mysql и отображать результаты. Однако из-за характера того, чего я пытаюсь достичь, мне нужно уметь сортировать по релевантности. Позвольте мне объяснить это лучше:
Обычный запрос "приложения apple iphone" будет выполнять поиск в базе данных с использованием % приложения apple iphone%, но если нет записей, которые отображают эту фразу в таком точном порядке, поиск ничего не даст.
Что мне в основном нужно сделать, так это найти "яблоко", "iphone" и "приложения" все отдельно, а затем объедините результаты в одно целое, а затем мне нужно оценить релевантность по количеству экземпляров слова, найденных в записях. Например, если я сделал то, что хотел, и он вернул их следующим образом:
Iphone Applications From Apple
Apple Make The Best Apple Iphone Applications
Iphone Applications
Они будут ранжированы следующим образом:
Apple Make The Best Apple Iphone Applications
Iphone Applications From Apple
Iphone Applications
Из-за того, сколько экземпляров поисковых запросов найдено. См. выделенное:
[Apple] Make The Best [Apple] [Iphone] [Applications]
[Iphone] [Applications] From [Apple]
[Iphone] [Applications]
Надеюсь, я объяснил это достаточно хорошо, и я был бы чрезвычайно признателен, если бы кто-нибудь мог бы дать мне какие-нибудь указания.
5 answers
Взгляните на Функции ПОЛНОТЕКСТОВОГО поиска MySQL , Они должны автоматически возвращать результаты по релевантности и предоставлять вам гораздо больший контроль над вашими поисками
Единственная потенциальная проблема с использованием полнотекстовых индексов заключается в том, что они не поддерживаются таблицами InnoDB.
Быстрый поиск в Google дал мне эту ссылку.
Пример:
select title, match (title,content) against (”internet”) as score
from cont
where match (title,content) against (”internet”) limit 10;
Возможно, это может кому-то помочь (упорядочить по релевантности и сохранить количество слов):
Нет полного текста:
SELECT *, ( (value_column LIKE '%rusten%') + (value_column LIKE '%dagen%') + (value_column LIKE '%bezoek%') + (value_column LIKE '%moeten%') ) as count_words
FROM data_table
WHERE (value_column LIKE '%dagen%' OR value_column LIKE '%rusten%' OR value_column LIKE '%bezoek%' OR value_column LIKE '%moeten%')
ORDER BY count_words DESC
Полный текст:
SELECT * FROM data_table
WHERE MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE)
ORDER BY MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE) DESC;
SELECT field2, field3, ..., MATCH(field1, field2) AGAINST ("search string") AS relevance WHERE MATCH(field1, field2) AGAINST "search string" ORDER BY relevance DESC LIMIT 0,10
В результирующем наборе будет поле "релевантность", которое используется здесь для сортировки результатов.
Я не знаю, чего именно вы хотите, но следующий код определенно работает для вас.
SELECT ("some text here" or `column_name`) RLIKE "Apple|Iphone|Application" AS Result ORDER BY Result DESC;
Разделите все слова с помощью строки(|), но результаты будут 1 или 0 основаны или не соответствуют. Если вы хотите получить обоснованные строки, смотрите Ниже.
SELECT * FROM "table_name" WHERE `column_name` RLIKE "Apple|Iphone|Application";