Как создать автозаполнение, чтобы получить ключевые слова так быстро, как поиск Google или живой поиск - PullRequest
4 голосов
/ 22 апреля 2009

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

Моя функция не слишком медленная, но по сравнению с тем, что делает live.com или google.com, очень медленно, я протестировал их и действительно чувствую, что они получают ключевые слова с моего компьютера, а не со своих серверов.

Как они получают ключевые слова очень быстро, как это, и уверены, что они в миллион миллионов раз больше моих ключевых слов?
Есть известный стиль, чтобы сделать это?
Кроме того, используя мой firebug, я обнаружил, что они не вызывают веб-сервис «возможно, он звонит так, как я не знаю», но я обнаружил на вкладке «Сеть», что происходит новое получение.

Ответы [ 8 ]

4 голосов
/ 22 апреля 2009

Вместо того, чтобы делать запрос при каждом нажатии клавиши, что, если вы просто делаете запрос каждый определенный промежуток времени, если в это время было нажатие клавиши? Если бы вы сделали что-то вроде 100 мсек с интервалом, это все равно выглядело бы «мгновенно», но потенциально могло бы быть намного меньше нагрузки на ваш сервер. Кроме того, у вас есть клиент кеширует ключевые слова? Если пользователь возвращается в поле поиска, ему не нужно повторно связываться с сервером, чтобы получить ключевые слова. Кроме того, вы можете сразу же фильтровать текущий список ключевых слов при каждом нажатии клавиши, не обращаясь к серверу (в итоге вы получите менее 10 из них, потому что некоторые / все те, что у вас уже есть, не будут содержать только что набранную букву). Это может заполнить «пробелы» между фактическими запросами данных, чтобы сделать их более мгновенными.

4 голосов
/ 22 апреля 2009

Не уверен, куда вы смотрите, но, конечно, на live.com я получаю запрос на каждое письмо:

Firbug Net Console - AutoComplete

Как вы можете видеть, очень мало возврата по проводам - ​​500B - это то, к чему вы стремитесь - тонкий веб-сервис, который возвращает минимум, необходимый для отображения этого пользователю.

Затем, как уже говорили другие, кешируйте предыдущие ответы и т. Д.

Не то, чтобы результаты часто были не в алфавитном порядке, и поэтому, если вы не отображаете свои критерии заказа, вы можете работать по принципу «Что-то сейчас лучше, чем полностью точное позже».

3 голосов
/ 05 мая 2009

Есть две основные вещи, которые вы можете сделать:

  1. Используйте как можно больше кэширования на стороне сервера. Ведь поисковые запросы следуют степенному закону. Есть несколько запросов с большим количеством запросов и много-много запросов с очень малым количеством запросов каждый. Идеальная среда для кэширования
  2. Вам необходимо минимизировать объем передаваемых данных, и один из способов сделать это - использовать radix tree . Если вам нужно передать список из 20 строк с общим префиксом, вам не нужно передавать 20 отдельных строк. Вы можете передать префикс один раз, а затем 20 различных частей.
3 голосов
/ 22 апреля 2009

Нет причин запрашивать условия поиска при каждом нажатии клавиши. Google делает это (1), потому что они могут, и (2), потому что они представляют термины через корпус Интернета.

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

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

Ограничение состоит в том, что в какой-то момент у вас закончатся предложенные термины. Но опять же, это действительно не проблема: даже у Google нет предложений по «транснормативному» (вымышленное слово, но в результате полного поиска есть 191 результат).

2 голосов
/ 19 мая 2009

Нашел этот пост в блоге, который подробно расскажет об этом:

Автозаполнение структур данных

2 голосов
/ 22 апреля 2009

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

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

1 голос
/ 22 апреля 2009

Как кто-то предлагал выше, использование ETag с REST api может означать дополнительное кэширование для повторных запросов. Ознакомьтесь с этой статьей в блоге Чео Грегорио, чтобы узнать больше информации о REST.

1 голос
/ 22 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...