Ранжирование поисковых ключевых слов

Вопрос: как ранжировать ключевые слова, которые использовались в поисковых запросах в моем веб-приложении, на основе времени и количества поисков?

Пользователь вводит свой поисковый запрос в текстовое поле. Через AJAX мне нужно вернуть пользователю некоторые предложения. Эти предложения основаны на количестве поисковых запросов по данному ключевому слову и должны быть отсортированы по последним поисковым запросам.

Например, если пользователь вводит поисковый запрос как «зависание», предложения должны быть в следующем порядке: «похмелье, часть 2», «похмелье».

Как мне спроектировать базу данных для хранения поисковых запросов? Как мне написать SQL-запрос, чтобы получить предложения?


person Jeyanth Kumar    schedule 13.09.2011    source источник


Ответы (3)


Для предложения запроса хорошим способом является подсчет количества вхождений каждого поискового запроса (вероятно, лучше не учитывать повторные запросы, сделанные одним и тем же пользователем). У вас будет файл/таблица/что-то (запрос, счет) вроде этого:

"britney spears" 12
"kelly clarkson" 5
"billy joel" 27
"query abcdef" 2
"lady gaga" 39
...

Затем вы можете отсортировать по убыванию вхождения:

"lady gaga" 39
"billy joel" 27    
"britney spears" 12
"lady xyz" 5
"query abcdef" 2
...

Затем, когда кто-то ищет, например, "lady", выполните префиксный поиск по всем строкам от верхней части файла/таблицы/чего-либо до нижней части. Если вам нужны только K предложения, вы пойдете только до тех пор, пока не найдете Top-K предложений.

Вы можете реализовать это, используя простой файл, или вы также можете иметь таблицу запросов для подсчета и выполнять запрос, аналогичный следующему:

SELECT q.query from (SELECT * from search_queries order by query_count DESC) as q where q.query LIKE "prefix%" LIMIT 0,K

Два примечания:

  1. Есть лучшие (и более сложные) способы сделать это. У Amazon, например, есть довольно хорошее предложение по запросу.
  2. Предоставленное решение будет предлагать только запросы, которые начинаются с пользовательского запроса. Нравиться:

    "леди" => ["леди гага", "леди xyz"]

Запрос «леди» не будет соответствовать «леди-гага». Чтобы они соответствовали, вам потребуется индексация запросов с помощью поддержки полнотекстового поиска вашей базы данных или внешней библиотеки, такой как Люсен.

person Felipe Hummel    schedule 14.09.2011
comment
@Jeyanth Kumar: Почему вы приняли этот ответ? Фелипе не объясняет, как упорядочить результаты по последнему поиску. т.е. Похмелье всегда будет перед похмельем 2, если у него больше поисков. Просто говорю! - person Briguy37; 16.09.2011
comment
@ Briguy37: вы можете легко сделать это, время от времени сбрасывая поле счетчика запросов. Вы можете сохранить столбец/поле для счетчика запросов за все время, а другой — для счетчика запросов за сегодняшний день и т. д. Концепция того, как это реализовать, одинакова. - person Felipe Hummel; 17.09.2011

В идеале вы должны отсортировать что-то вроде следующего:

order by sum(# of searches / (how long ago that search was performed + 1))

Это должно быть изменено так, чтобы давность была основана на соответствующем базовом времени. Например, если вы хотите, чтобы количество поисковых запросов через неделю составляло половину, вы должны сделать неделю = 1.

Это будет явно неэффективно, потому что вычисление того, как давно был выполнен каждый поиск для всех результатов поиска, займет много времени. Таким образом, вы можете захотеть сохранить промежуточный итог для каждого поиска и умножить итоги на определенное значение для каждого периода времени. Например, если вы хотите, чтобы количество поисковых запросов через неделю составляло половину, вы должны добавить один в этот столбец для каждого поиска. Тогда у вас будет процесс, который умножает столбец поиска на 0,5 каждую неделю. Затем вы просто сортируете по этому столбцу.

person Briguy37    schedule 13.09.2011

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

person Ghazanfar Mir    schedule 13.09.2011