Клуб API Карт

Как реализован поиск вариантов городов

Пост в архиве.

Здравствуйте. Хочу реализовать у себя поиск по городам, и увидел у яндекса когда вводишь что-то в поле поиска на стр http://maps.yandex.ua/ то там осуществляется автободбор вариантов. Как мне реализовать такое?

4 комментария

Здравствуй. Нет, именно автоподбор возможных вариантов. например в поиск пишешь "Моск" а оно тебе автоматом 10 вариантов возможных вариантов того что ты имел ввиду...

Алексей Yarrr!
28 января 2016, 04:00

это называется suggest, иногда еще autocomplete.

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

Строка "моск" и тематика клуба наводит на мысли о поиске городов, их в россии считанные тысячи, в собранном виде трехбуквенных сочетаний ключей будет не много, особенно если отсеч поселки городского типа и небольшие города из 5-10 тысяч человек - останется порядка трех-четырех тысяч названий, из них сделать ключики - пара килобайт, и с помощью них делать предварительную фильтрацию запросов, а дальше аякс запрос на сервер, если ключик найден, за адекватными результатами имеющихся названий. ы. Я бы сделал кешируемый json объект из трех-четырех букв, где первую букву - в ключи корневому объекту, внутри каждой буквы по ключу второй буквы, и там внутри хэш из ключен третих букв. Если нужны только сравнительно большие города (скажем, от 50к жителей) - то все данные в json займут примерно 1000*10*(2+6) - где-то 80 кб текста, а в gz и того меньше. А если экпортировать ключи в js (не json с юникод кодированием аля "\u4012"), то максимум это займет, если экспортировать так ["abc","def",...], а затем собрать на клиенте в хэш, 6символов*(32^3), ~195 Кб, но в реальности раз в 10 меньше, потому что нет городов ыыы и ььь. А можно вообще строкой, разделенной запятыми передать. "мос|оск|скв|ква".split("|"), зачем лишние байты ;-) В общем, это дело десятое, как ты будешь данные выгребать оттуда. ;-))

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

p.s. Кстати, это предварительная очень грубая фильтрация, и хватит двух символов... 200 байт на ключики + 200 байт на фукцию фильтра. 3 избыточно.

Спасибо)