Інтеграція ФІАС для адресних підсказок на сайті
ФІАС (Федеральна інформаційна адресна система) — офіційний державний реєстр адрес Росії. Його дані розповсюджуються безплатно, оновлюються щотижня та використовуються як еталонна база для перевірки коректності адрес. Для реалізації адресних підсказок на сайті ФІАС рідко використовується напрямку: повна база важить кілька гігабайт і потребує окремої інфраструктури. На практиці працюють через 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. Стоимість власної інфраструктури: окремий сервер з 8+ ГБ RAM, ~50 ГБ дискового пространства, налаштування автообновлення дельт. Первинна завантаження та налаштування займає 1–2 робочих дні, без урахування отладки якості пошуку.







