Как я могу сделать двигатель "частых поисков"? - PullRequest
0 голосов
/ 27 августа 2010

Моей первой идеей было начать хранить каждое слово в базе данных, игнорируя слова с 2 или менее символами, и каждый раз, когда слово повторяется, просто добавляйте одно в строку счетчика (скажем importance), чтобы появиться первым в списке частых поисков,Звучит хорошо, пока вы не подумаете, что обычно вы ищете разные слова, а не только одно слово, например: для big house, вы можете сохранить big house как частый поиск, а не big и house.

Я немного запутался в том, как сделать это и сделать это правильно.Кто-нибудь делал что-то подобное?Что вы думаете о правильном способе сделать это?

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

Мой ответ содержит не алгоритмические шаблоны, а поведенческие, за которые вы можете ловить рыбу.

Включите некоторое время поисковое ведение журнала. (Что ищут люди)

Запишите, какие успешные поиски, те, которые действительно находят результаты (результаты найдены).

Вы можете уточнить эту идею, указав, какие ресурсы люди нажимают, когда ищут термин.

Это дает вам: Что люди ищут и что они, вероятно, имели в виду.

Продолжайте в том же духе, а затем уточняйте его с помощью временных данных: «по выходным люди ищут это»

Это поможет составить представление о том, как используется ваш поиск, и позволит вам «перехватывать» поисковые термины и вставлять «вы имели в виду?» помощники по поиску в стиле, и на вашей домашней странице "популярные в это время года" ссылки поиска.

Итак, изначально таблица поиска для записи происходящего:

term | results_cnt | daydate | session

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

1 голос
/ 27 августа 2010

Вам необходимо хранить полные ключевые слова либо в индексе, либо в базе данных (я бы порекомендовал вам использовать такие индексы, как Zend_Lucene или Swish, для которых доступны очень гибкие API). Затем вы должны применить поиск на расстоянии, то есть поиск, где два или более ключевых слова находятся на определенном расстоянии. Zend Lucene и swish имеют встроенные методы, которые будут давать отсортированные результаты в соответствии с их рейтингом после применения поиска близости.

Zend_search_Lucene Документация приведена здесь http://framework.zend.com/manual/en/zend.search.lucene.html. Пожалуйста, не стесняйтесь спрашивать, нужны ли вам детали реализации.

Swish доступен как отдельный модуль , который может быть запущен через CMD, и также доступен как php расширение .

Также, если вам нужна индивидуальная реализация алгоритма Proximity, вы можете просмотреть его вики для деталей http://en.wikipedia.org/wiki/Proximity_search_%28text%29

Отредактировано: Если вы ищете решение для базы данных, то вы можете создать функцию, которая применяет вашу собственную реализацию алгоритма поиска Proximity для извлечения лучших связанных запросов. Вы также должны посмотреть на Полнотекстовый поиск mySql .

1 голос
/ 27 августа 2010

Хм, я бы создал 2 таблицы

Поиск и Частота поиска

Поиски будут содержать все поиски, а частота поиска - это список повторных поисков, так что это будет выглядеть так

------------------------------------------------------
frequency_id     frequency_sid     frequency_counter
------------------------------------------------------
1                3                 33
2                56                66
3                33                128
.....

Тогда вы можете сделать

SELECT * FROM Searches,SearchFrequency WHERE search_id = frequency_sid ORDER BY frequency_counter DESC LIMIT 30

и просто обновите таблицы так,

id = INSERT INTO Searches ....
INSERT INTO SearchFrequency (frequency_sid,frequency_counter) VALUES (id,frequency_counter + 1);

При этом обе таблицы будут обновляться, и вы также сможете отслеживать индивидуальный поиск по IP, связанным запросам и т. Д. И т. Д.

Затем можно также настроить таблицу SearchKeywordsFrequency , чтобы можно было разбирать результаты поиска и сохранять отдельные слова, а затем создать корабль отношения многие-ко-многим с помощью SearchFrequency

...