Мгновенный поиск

Я начал работать над основным инструментом мгновенного поиска.

Это проект рабочего процесса.

  1. Пользователь нажимает клавишу
  2. Текущее значение передается в функцию, которая выполняет Ajax-вызов веб-службы.
  3. Веб-служба выполнит выборку в базе данных через LINQ-To-SQL и получит список значений, соответствующих моему значению. Я добьюсь этого с помощью предложения SQL Like
  4. Веб-сервис вернет данные в функцию.
  5. Функция заполняет относительные элементы управления через jQuery.

У меня есть следующие проблемы / соображения:

Проблема: Быстрые машинистки: я набрал это предложение в течение нескольких секунд. Это означает, что при каждом нажатии клавиши я буду отправлять запрос в базу данных. У меня может быть 10 человек, делающих то же самое. Сервер может вернуть список из 5 записей, или он может вернуть список из 1000 записей. Также я могу удерживать клавишу, и это отправит несколько сотен запросов к базе данных - это может потенциально замедлить работу всей системы.

Возможные решения:

  1. Таймер, по которому я смогу отправлять запрос в базу данных каждые 2-4 секунды.
  2. Не возвращайте никаких данных, если значение не менее 3 символов
  3. Вернуть ограниченное количество строк?

Проблема: я не уверен, справится ли LINQ-to-SQL с потенциальной нагрузкой.

Решение: я могу использовать хранимые процедуры, но есть ли другие возможные альтернативы?

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

Спасибо

2 ответа

Решение

Когда звонить в веб-сервис

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

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

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

Вы можете использовать setTimeout функция для вызова вашего веб-сервиса через 500 миллисекунд после того, как пользователь нажал клавишу. Если пользователь нажимает клавишу, вы можете сбросить время ожидания, используя clearTimeout, Это приведет к вызову веб-службы только тогда, когда пользователь простаивает в течение полсекунды.

Производительность LINQ-to-SQL

Если ваш запрос не слишком сложен, LINQ-to-SQL, вероятно, будет работать очень хорошо.

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

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

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

Другие вопросы по тегам