Сервис для извлечения текста из PDF-файлов с использованием Apache Tika и индексации документов в MeiliSearch.
- Загрузка PDF-файлов
- Извлечение текста с помощью Apache Tika
- Индексация документов в MeiliSearch для быстрого поиска
- REST API для взаимодействия с сервисом
- Docker-контейнеризация для простого развертывания
- Поддержка CORS для веб-приложений
- Docker и Docker Compose
- Go 1.21 или выше (для локальной разработки)
-
Клонируйте репозиторий:
git clone https://github.com/yourusername/pdf-indexer.git cd pdf-indexer -
Создайте файл
.envна основе.env.example:cp .env.example .env
-
Запустите сервис с помощью Docker Compose:
docker compose up -d
Сервис использует следующие переменные окружения:
APP_PORT— порт для API (по умолчанию9006)FORWARD_MEILISEARCH_PORT— порт для MeiliSearch (по умолчанию7705)MEILISEARCH_KEY— ключ доступа к MeiliSearch (по умолчаниюmasterKey)MEILI_LOG_LEVEL— уровень логирования MeiliSearch (по умолчаниюDEBUG)
Все API-эндпоинты поддерживают CORS и доступны с любого домена.
POST /api/upload
Content-Type: multipart/form-data
file: <pdf_file>Пример запроса:
curl -X POST http://localhost:9006/api/upload \
-H "Content-Type: multipart/form-data" \
-F "file=@/path/to/your/document.pdf"Ответ:
{
"message": "Документ успешно загружен",
"document_id": "123e4567-e89b-12d3-a456-426614174000"
}GET /api/list?page=<page_number>&limit=<items_per_page>Параметры запроса:
page— номер страницы (по умолчанию: 1)limit— количество документов на странице (по умолчанию: 10, максимум: 100)
Документы сортируются по дате создания (сначала новые).
Пример запроса:
curl "http://localhost:9006/api/list?page=1&limit=20"Пример ответа:
{
"documents": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"title": "example1.pdf",
"text": "Содержимое первого PDF-файла...",
"created_at": "2023-03-22T12:34:56Z"
},
{
"id": "223e4567-e89b-12d3-a456-426614174001",
"title": "example2.pdf",
"text": "Содержимое второго PDF-файла...",
"created_at": "2023-03-21T10:20:30Z"
}
],
"pagination": {
"current_page": 1,
"total_pages": 5,
"limit": 20,
"total_items": 98
}
}GET /api/file/:idПример запроса:
curl http://localhost:9006/api/file/123e4567-e89b-12d3-a456-426614174000Пример ответа:
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"title": "example.pdf",
"text": "Содержимое PDF-файла..."
}GET /api/search?q=<search_query>Результаты поиска сортируются по дате создания (сначала новые).
Пример запроса:
curl "http://localhost:9006/api/search?q=ваш+поисковый+запрос"DELETE /api/file/:idПример запроса:
curl -X DELETE http://localhost:9006/api/file/123e4567-e89b-12d3-a456-426614174000Сервис использует Apache Tika для извлечения текста из PDF-файлов. После загрузки PDF-файла:
- Файл отправляется в Apache Tika для извлечения текста
- Извлеченный текст очищается от HTML-разметки и технических метаданных
- Текст сохраняется в MeiliSearch для последующего поиска
Обработанные документы содержат следующие поля:
id: Уникальный идентификатор документаtitle: Название документа (имя PDF-файла)text: Извлеченный и очищенный текст документаcreated_at: Дата и время загрузки документа
pdf-indexer/
├── main.go # Точка входа в приложение
├── internal/
│ ├── handlers/ # HTTP-обработчики
│ │ ├── upload.go # Обработчик загрузки PDF
│ │ ├── list.go # Обработчик получения списка документов
│ │ ├── search.go # Обработчик поиска
│ │ └── document.go # Обработчик операций с документом
│ ├── services/ # Бизнес-логика
│ │ ├── meilisearch.go # Сервис для работы с MeiliSearch
│ │ └── tika.go # Сервис для работы с Apache Tika
│ ├── models/ # Модели данных
│ │ ├── document.go # Структура документа
│ │ └── tika_response.go # Структура ответа Tika
│ └── config/ # Конфигурация
│ └── config.go # Загрузка конфигурации
├── compose.yml # Конфигурация Docker Compose
├── compose.local.yml # Локальная конфигурация Docker Compose
├── Dockerfile # Dockerfile для сборки приложения
├── go.mod # Зависимости Go
├── go.sum # Контрольные суммы зависимостей
└── README.md # Документация проекта
Сервис состоит из следующих компонентов:
- API Server (Go + Gin) — обработка HTTP-запросов
- Apache Tika — извлечение текста из PDF-файлов
- MeiliSearch — поисковый движок для индексации и поиска документов
-
Установите зависимости:
go mod download
-
Запустите сервис локально:
go run main.go
go test ./...- Gin — веб-фреймворк для Go
- Apache Tika — извлечение текста из документов
- MeiliSearch — поисковый движок
- Docker — контейнеризация
- Docker Compose — оркестрация контейнеров
MIT