Skip to content

popovdk/PDF-Indexer

Repository files navigation

PDF Indexer

Сервис для извлечения текста из PDF-файлов с использованием Apache Tika и индексации документов в MeiliSearch.

Возможности

  • Загрузка PDF-файлов
  • Извлечение текста с помощью Apache Tika
  • Индексация документов в MeiliSearch для быстрого поиска
  • REST API для взаимодействия с сервисом
  • Docker-контейнеризация для простого развертывания
  • Поддержка CORS для веб-приложений

Требования

  • Docker и Docker Compose
  • Go 1.21 или выше (для локальной разработки)

Установка и запуск

  1. Клонируйте репозиторий:

    git clone https://github.com/yourusername/pdf-indexer.git
    cd pdf-indexer
  2. Создайте файл .env на основе .env.example:

    cp .env.example .env
  3. Запустите сервис с помощью 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 Endpoints

Все API-эндпоинты поддерживают CORS и доступны с любого домена.

Загрузка PDF-файла

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
  }
}

Получение информации о документе по ID

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

Обработка PDF

Сервис использует Apache Tika для извлечения текста из PDF-файлов. После загрузки PDF-файла:

  1. Файл отправляется в Apache Tika для извлечения текста
  2. Извлеченный текст очищается от HTML-разметки и технических метаданных
  3. Текст сохраняется в 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 — поисковый движок для индексации и поиска документов

Разработка

Локальный запуск

  1. Установите зависимости:

    go mod download
  2. Запустите сервис локально:

    go run main.go

Тестирование

go test ./...

Используемые технологии

  • Gin — веб-фреймворк для Go
  • Apache Tika — извлечение текста из документов
  • MeiliSearch — поисковый движок
  • Docker — контейнеризация
  • Docker Compose — оркестрация контейнеров

Лицензия

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published