Как отсортировать результаты поиска по частоте попаданий? - PullRequest
1 голос
/ 28 июня 2011

Я создал поисковый индекс (таблица из двух столбцов), который присваивает отдельные ключевые слова их идентификатору контента.

Теперь поиск по отдельным ключевым словам работает и чертовски быстр.

Тем не менее, поиск нескольких ключевых слов, таких как SELECT media_id, keyword FROM search_index WHERE keyword = 'b' OR keyword = 'a' вернет результаты в алфавитном порядке ключевых слов (все попадания сначала 'a', затем 'b').

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

Я также пытался GROUP BY, который, казалось, группировал результат из алфавитного порядка по их отдельным идентификаторам.

Edit: Наконец я нашел что-то вроде SELECT DISTINCT media_id, keyword, COUNT(media_id) AS num FROM search_index GROUP BY media_id ORDER BY num DESC, которое работает довольно хорошо, но очень медленно.

Так что, если я ищу «b» и «a», я хочу, чтобы идентификаторы с «a» и «b» были первыми в результате.

Так, как я могу сказать MySQL сортировать выходные данные по частоте обращений к одному идентификатору, все еще будучи чертовски быстрым?

Ответы [ 3 ]

1 голос
/ 28 июня 2011

Как насчет этого?

SELECT *, CAST (ключевое слово = 'a' КАК ПОДПИСАНО) + CAST (ключевое слово = 'b' КАК ПОДПИСАНО) КАК Ранг ИЗ search_index ORDER BY RANK DESC

0 голосов
/ 28 июня 2011

Хорошо, я понял это сам.

Кажется, быстрее всего сделать SELECT media_id, keyword, COUNT(media_id) AS num WHERE ... GROUP BY media_id, а затем перейти через поле num с помощью простой функции php-usort.

function SortFrequency($a, $b)
{
     if ($a['num'] == $b['num']) return 0;
     return ($a['num'] > $b['num']) ? -1 : 1;
}

usort($results, 'SortFrequency');
0 голосов
/ 28 июня 2011

MySQL имеет полнотекстовый поиск , который возвращает оценку релевантности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...