Интеграция ФИАС для адресных подсказок на сайте
ФИАС (Федеральная информационная адресная система) — официальный государственный реестр адресов России. Его данные распространяются бесплатно, обновляются еженедельно и используются как эталонная база для проверки корректности адресов. Для реализации адресных подсказок на сайте ФИАС чаще всего не используется напрямую: полная база весит несколько гигабайт и требует отдельной инфраструктуры. На практике работают через DaData или аналогичные сервисы, которые сами хранят и индексируют ФИАС-данные, предоставляя удобный API поверх.
Тем не менее, если стоит задача работать с ФИАС без посредников — например, в закрытом контуре или для внутреннего корпоративного портала — нужно выстраивать собственную инфраструктуру.
Получение и загрузка данных ФИАС
Актуальные дампы публикуются на сайте https://fias.nalog.ru/. Доступны два формата: полная база (XML, несколько десятков архивов) и дельта-обновления (еженедельные). С 2022 года ФИАС планомерно заменяется ГАРС (ГАР), формат XML немного изменился, но принципы те же.
Минимальный набор таблиц для адресных подсказок:
-
AS_ADDR_OBJ— регионы, районы, города, улицы -
AS_HOUSES— дома, строения, корпуса -
AS_HIERARCHY— иерархические связи объектов -
AS_ADDR_OBJ_PARAMS— дополнительные параметры (почтовый индекс и др.)
Загрузка XML-дампа в PostgreSQL через php-скрипт или python-парсер занимает 3–6 часов на первый раз. Для последующих обновлений используются дельта-файлы — загрузка занимает 10–30 минут.
Структура таблиц и индексы
CREATE TABLE addr_obj (
id UUID PRIMARY KEY,
object_id BIGINT,
name TEXT NOT NULL,
type_name TEXT,
level SMALLINT,
is_active BOOLEAN DEFAULT true
);
CREATE TABLE houses (
id UUID PRIMARY KEY,
object_id BIGINT,
addr_obj_id BIGINT,
house_num TEXT,
build_num TEXT,
struct_num TEXT,
is_active BOOLEAN DEFAULT true
);
-- Индекс для полнотекстового поиска
CREATE INDEX idx_addr_obj_name_fts
ON addr_obj USING GIN (to_tsvector('russian', name));
-- Индекс для иерархии
CREATE INDEX idx_hierarchy_parent ON hierarchy(parent_obj_id);
CREATE INDEX idx_hierarchy_child ON hierarchy(object_id);
Без GIN-индекса поиск по 20+ млн записей будет нестерпимо медленным.
API для подсказок
Простой endpoint на PHP/Laravel, который принимает строку и возвращает список вариантов:
public function suggest(Request $request): JsonResponse
{
$query = trim($request->input('q', ''));
if (mb_strlen($query) < 2) {
return response()->json([]);
}
$results = DB::select("
SELECT
ao.name,
ao.type_name,
ao.level,
h.path_name
FROM addr_obj ao
JOIN addr_hierarchy h ON h.object_id = ao.object_id
WHERE to_tsvector('russian', ao.name) @@ plainto_tsquery('russian', ?)
AND ao.is_active = true
ORDER BY ao.level, ao.name
LIMIT 10
", [$query]);
return response()->json($results);
}
Для ввода домов запрос немного сложнее — нужно сначала найти улицу по её object_id, затем искать дома по addr_obj_id.
Фронтенд: подключение подсказок
На стороне браузера — стандартная логика debounce + fetch:
let timer;
input.addEventListener('input', () => {
clearTimeout(timer);
timer = setTimeout(async () => {
const q = input.value.trim();
if (q.length < 2) return;
const res = await fetch(`/api/fias/suggest?q=${encodeURIComponent(q)}`);
const data = await res.json();
renderDropdown(data);
}, 250);
});
Задержка 250 мс исключает запрос на каждый нажатый символ.
Нюансы собственной инфраструктуры
Собственная ФИАС-база оправдана, когда: нет возможности использовать внешние сервисы (закрытая сеть, требования ИБ), планируется очень высокий объём запросов (десятки тысяч в сутки), нужна полная кастомизация логики поиска.
Если таких ограничений нет — проще и дешевле работать через DaData (см. страницу по интеграции DaData). Стоимость собственной инфраструктуры: отдельный сервер с 8+ ГБ RAM, ~50 ГБ дискового пространства, настройка автообновления дельт. Первичная загрузка и настройка занимает 1–2 рабочих дня, без учёта отладки качества поиска.







