Website development
15 January 2011

Быстрый автокомплит с использованием libscgi

Недавно была опубликована статья "libscgi — эффективное решение для простых и быстрых скриптов". Хотелось бы продолжить ранее представленую тему с более практической стороны. Как уже догадались из название — речь пойдет об скрипте автокомпита.

Пользователей, и меня в частности, всегда разражали эти уж медленные автокомплиты. Бывает наберешь уже почти все слово, как появляется выпадающая менюшка. Понятно, что JavaScript сам по себе медленный. Но если еще автокомплит будет тормозить на стороне сервера, то вообще как-то кисло получается. Выход есть, если на серверной части использовать, что-то более быстрое, как вариант можно использовать бинарный скрипт с использованием libscgi. Исходники тут. Чуть ниже подробности.


Описание Данных

В данном примере скрипт осуществляет автокомплит по городам. Данные по всем городам записываются в файл формата csv. Данный файл (у меня 26 тыс строк) считывает в память и хранится в ввиде хеш-массива. ключом является приведенное к нижнему регистру название города или его псевдонима. В связи с переименованиями в Советское и пост Советское время, некоторые города имеют по несколько названий, например: Лениград, Питер, Санкт-Петербург. По этому — первая колонка — это приведенное имя или приведенный псевдоним города. Вторая колонка — официальное название города (первая буква большая). Треть колонка — это ранг города. Если мы выводим все города на буквы М, то для Пользователя предпочтительней, что бы Москва была раньше (первой в списке), нежеле Макеевка или Малиновка. Четвертый столбец — это id города по БД. Можно реализовать загрузку осуществить из БД напрямую, при загрузке демона автокомплита. Ранг нисходящий — наибольший приоритет имеет 1.

Пример данных входного файла:
"абатский","Абатский",2188,2188
"абаша","Абаша",9711,9711
"абашири","Абашири",21156,21156
"абдулино","Абдулино",1424,1424

Для запрос на поиск используется метод POST, тело которого составляет один-два-три и более поисковых символа. Запрос отправляется на предопределенный url http: // hostname/cityes Данный урл можно изменить, указав новый в исходниках.

Так как автокомплит осуществляется по технологии AJAX, то в качестве выходного формата данных был выбран json. Выходной формат:
{
"cityes" : [
{ "name": "New York", "id":90},
{ "name": "New Vasyki", "id":808},
{ "name": "Nazareth", "id":1505},
{ "name": "Neaple", "id":1965}],
"time":304
}

Ограничение на вывод — 10 пунктов меню. Приктика показала, что больше не надо. Но если хочется, то можно измененить DEFINE определение в исходниках: autocomplete.cpp

необязательный параметр «time», реализован для контроля — время поиска в микросекундах. Реальное время незначительно больше, за счет обработки самим scgi сервером и nginx. Реально это где-то 0,5-0,7 мс (миллисекунд)

Объем занимаемой памяти демона для 25 тыс строк данных — 600 К. Потребляемое CPY — практически 0%. Очень хорошо разгружает БД, если у нас автокомплит был ранее на БД (я использовал redis, но с внедрением libscgi — потихоньку от него отказываюсь). Пока все находится в режими тестирования, но работает красиво и быстро.

Компиляция:

make lib — компилится библиотека
make ac компилится файл автокомплита

Запуск

./server /path/to/cityes_file

Предлагаем идеи, где еще можно использовать libscgi.
Сделаем вместе Мир добрее и лучше!

+2
1.2k 20
Comments 11