Каков наилучший способ реализовать автозаполнение на сервере? - PullRequest
5 голосов
/ 07 ноября 2010

Этот вопрос простой человек. Сделать автозаполнение красивым в клиентской части веб-приложения просто. Есть много плагинов.

Но, с другой стороны, на стороне сервера, как лучше это сделать? Мне не нравится идея нажимать на БД при каждом нажатии пользователем клавиши.

Я думал о сфинксе или о какой-то полнотекстовой поисковой системе, работающей параллельно с вашего сайта.

Например, если у меня есть веб-сайт PHP (с большим трафиком), я могу создать параллельный скрипт на python, который получает http-запросы от моих «автозаполненных текстовых полей». Затем, когда пользователь нажимает клавишу на стороне клиента, запросы AJAX направляются в тот сценарий Python, который может использовать специальную стратегию.

Каков твой подход?

Некоторые условные обозначения:

  • Старайтесь не бить по БД. Я имею в виду, получить запрос и сделай что-нибудь SELECT * ОТ foo ГДЕ бар, КАК "req%" не хороший ответ. Это может быть хорошим стратегия, но я знаю, как это сделать. *
  • Реплицированные данные могут быть хорошим выбором.

Ответы [ 2 ]

8 голосов
/ 07 ноября 2010

Я согласен, что вам нужно лучшее решение. Apache solr имеет функцию «предложения», которую вы можете использовать довольно хорошо. Если ваш набор данных небольшой, поместите все данные в память и просто выполните простой цикл.

На внешнем интерфейсе я рекомендую использовать setTimeout (), чтобы подождать около 200 мс, прежде чем запускать вызов ajax. Если за эти 200 мс сработало другое нажатие клавиши, отмените последний тайм-аут и начните еще один. Это действительно чистое решение, в котором оно не будет попадать в базу данных при каждом нажатии клавиши. Я использовал его в прошлом, и он работает очень хорошо.

Это объясняет solr с помощью jquery и как действительно хорошо создать автозаполнение. http://www.mattweber.org/2009/05/02/solr-autosuggest-with-termscomponent-and-jquery/

0 голосов
/ 07 ноября 2010

Вы говорите в комментариях, что это небольшой набор данных ключевых слов. Таким образом, может быть целесообразным, чтобы клиент запрашивал весь список, как только пользователь начинает вводить данные в поле, а затем должен JavaScript реагировать на изменения в пользовательском вводе на стороне клиента.

Это одно попадание сервера на поле на страницу (и только в том случае, если пользователь вводит данные в поле), и вы можете кэшировать его на сервере, чтобы ему редко приходилось попадать в БД.

Редактировать: Кэширование на сервере - большая победа, потому что список одинаков для каждого запроса и для всех пользователей, но даже лучше, это означает, что вы можете кэшировать список в браузере клиента, используя заголовок Expires или Etag с подходящим периодом в ответе. Таким образом, пользователь может получить неограниченное автозаполнение только для одного (хорошо кэшированного) попадания на сервер за весь период кеша браузера.

...