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

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

0 голосов
/ 29 сентября 2010

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

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

  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 ]

1 голос
/ 30 сентября 2010

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

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

1 голос
/ 29 сентября 2010

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

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

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

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

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

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

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

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

...