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]

Надеюсь, я объяснил это достаточно хорошо, и я был бы чрезвычайно признателен, если бы кто-нибудь мог бы дать мне какие-нибудь указания.

Author: zuk1, 2008-12-05

5 answers

Взгляните на Функции ПОЛНОТЕКСТОВОГО поиска MySQL , Они должны автоматически возвращать результаты по релевантности и предоставлять вам гораздо больший контроль над вашими поисками

Единственная потенциальная проблема с использованием полнотекстовых индексов заключается в том, что они не поддерживаются таблицами InnoDB.

 7
Author: Neil Aitken, 2008-12-05 15:47:39

Быстрый поиск в Google дал мне эту ссылку.

Пример:

select title, match (title,content) against (”internet”) as score 
from cont 
where match (title,content) against (”internet”) limit 10;
 6
Author: Filip Ekberg, 2012-05-06 11:44:25

Возможно, это может кому-то помочь (упорядочить по релевантности и сохранить количество слов):

Нет полного текста:

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;
 4
Author: Martijn H., 2015-05-25 14:00:22
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

В результирующем наборе будет поле "релевантность", которое используется здесь для сортировки результатов.

 1
Author: Murat Ayfer, 2008-12-05 15:55:05

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

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";
 0
Author: Rohit Kumar, 2017-04-08 04:16:35