Геокодер для поиска адресов с использованием PostgreSQL и PostGIS. Поддерживает полнотекстовый поиск по русским и английским адресам.
- Полнотекстовый поиск адресов с использованием PostgreSQL tsvector
- Поддержка русского языка для поиска по российским адресам
- Географические координаты - возвращает широту и долготу для найденных адресов
- Ранжирование результатов по релевантности поиска
- Docker контейнеризация для простого развертывания
- Docker и Docker Compose
- PostgreSQL с расширением PostGIS
- Python 3.12+
git clone <repository-url>
cd GeocoderСоздайте файл .env в корне проекта:
DB_HOST=geocoder_db
DB_PORT=5432
DB_USER=postgres
DB_PASS=postgres
DB_NAME=mydatabaseСоздайте файл .env.db в корне проекта:
POSTGRES_DB=mydatabase
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgresdocker-compose up -d geocoder_dbВажно! Используйте этот метод для корректного импорта русских символов:
# Копируем дамп в контейнер
docker cp dump.sql geocoder_db:/tmp/dump.sql
# Импортируем изнутри контейнера
docker exec geocoder_db psql -U postgres -d mydatabase -f /tmp/dump.sqldocker-compose run --rm clidocker-compose run --rm apiПосле запуска приложения введите адрес для поиска:
Введите адрес: Москва
После запуска Апи версии введите адрес для поиска:
http://localhost:8000/geocode/?query=Москва, улица Тверская, 5
- Русские адреса: "Москва", "Санкт-Петербург", "улица Тверская"
- Английские адреса: "London", "Paris", "New York"
- Частичные адреса: "Тверская", "Невский"
===== Результат поиска =====
📍 Адрес: Москва, улица Тверская, 5
🌍 Координаты: 55.7558, 37.6176
📊 Релевантность: 0.85
============================
Geocoder/
├── .env # Конфигурация приложения
├── .env.db # Конфигурация базы данных
├── docker-compose.yml # Docker Compose конфигурация
├── dump.sql # Дамп базы данных с адресами
├── Dockerfile # Docker образ для приложения
├── requirements.txt # Python зависимости
└── src/
├── main.py # Главный файл приложения
├── search.py # Логика поиска адресов
├── result_formatter.py # Форматирование результатов
└── db/
├── config.py # Конфигурация базы данных
└── database.py # Подключение к БД
Таблица addresses:
osm_id- ID из OpenStreetMaphousenumber- Номер дома (JSON)street- Название улицы (JSON)city- Город (JSON)postcode- Почтовый индекс (JSON)country- Страна (JSON)geom- Геометрические координаты (PostGIS)full_address- Полный адрес (TEXT)search_vector- Вектор для полнотекстового поиска (tsvector)
- Установите зависимости:
pip install -r requirements.txt- Настройте переменные окружения для локальной разработки:
DB_HOST=localhost
DB_PORT=5433
DB_USER=postgres
DB_PASS=postgres
DB_NAME=mydatabase- Запустите приложение:
python src/main.py# Проверка подключения к БД
docker exec geocoder_db psql -U postgres -d mydatabase -c "SELECT COUNT(*) FROM addresses;"
# Проверка русских символов
docker exec geocoder_db psql -U postgres -d mydatabase -c "SELECT full_address FROM addresses WHERE full_address ~ '[А-Яа-я]' LIMIT 5;"
# Тест поиска
docker exec geocoder_db psql -U postgres -d mydatabase -c "SELECT full_address FROM addresses WHERE full_address ILIKE '%Москва%' LIMIT 5;"Решение: Импортируйте дамп базы данных:
docker cp dump.sql geocoder_db:/tmp/dump.sql
docker exec geocoder_db psql -U postgres -d mydatabase -f /tmp/dump.sqlРешение: Используйте правильный метод импорта (см. раздел "Импорт данных")
Решение: Убедитесь, что контейнеры запущены:
docker ps
docker-compose up -dРешение: Проверьте файлы .env и .env.db на корректность паролей
- База данных: ~290,000 адресов
- Время поиска: < 100ms для большинства запросов
- Память: ~500MB для PostgreSQL контейнера
- Диск: ~2GB для полной базы данных
Создано с ❤️ для поиска адресов