porcula-rs
Что это?
Это поиск по локальной коллекции книжек в формате FictionBook2 (например архивы librusec,flibusta)
В некотором смысле урезанный аналог MyHomeLib/Calibre/Simple OPDS.
Реализация на Rust
Цели
- индексация FB2-книг внутри zip-файлов
- полнотекстовый поиск по названию/автору/аннотации/тексту книги
- выдача каталога в формате OPDS
- примитивный веб-интерфейс, цель - работа на электронной читалке типа Onyx/PocketBook и ПК
- просмотр книги в браузере как HTML
- отсутствие runtime-зависимостей
Требования
- ОС поддерживаемая Rust (Linux,Windows,MacOS,…)
- для большой библиотеки требуется 64-битная ОС
- место под базу - примерно 1/6 от объёма исходных файлов
- для индексации желательно мощное железо (от 4 ядер, 16 ГБ памяти, SSD)
- поиск в веб-приложении требует гораздо меньше ресурсов
Сборка
cargo build --release
В режиме debug скорость приложения на порядок ниже!
Для сборки на Windows требуется MinGW64
Установка
В релизе просто запакованный исполняемый файл.
Установки не требуется - просто распаковать его куда-нибудь на локальный диск, где достаточно свободного места.
Никаких runtime-зависимостей кроме обычно имеющейся библиотеки msvcrt/libc нет, но пока проверено только на Win 10 и Ubuntu 18/20.
Индексация
Для начала надо проиндексировать коллекцию книг.
По умолчанию индексируются только книги на русском, а в индекс включается не только название/автор/аннотация, но и ВЕСЬ текст книги.
Приложение консольное, нужно задать параметры индексации:
-
как минимум надо задать путь к книгам:
porcula --books-dir=путь index
В таком режиме работает долго (3-6 часов) и индекс для неназываемой раздачи получается 50 гигабайт. Скорость индексации на Ryzen 1700 + 16GB RAM + NVMe SSD: примерно 70 ГБ в час.
-
если нужен поиск слов во всех формах (без учёта склонения/спряжения):
porcula --books-dir=путь index --lang=ru --stemmer=ru --xbody=on
-
если надо быстрее или места мало:
porcula --books-dir=путь index --body=off --xbody=off
В таком режиме индексация идёт пару часов, размер индекса - около 2 гигабайт.
-
ещё быстрее если отключить извлечение обложек и аннотаций:
porcula --books-dir=путь index --body=off --xbody=off --annotation=off --cover=off
Размер такого индекса - менее 200 мегабайт.
-
если нужны книги на нескольких языках:
porcula --books-dir=путь index --lang=ru,en
Индексацию можно в любой момент прервать (Ctrl+C), а потом возобновить командой
porcula index
При этом используются предыдущие настройки индекса. Добавление нового архива с книгами делается этой же командой.
Если надо поменять настройки индекса, то придётся удалить подкаталог ‘index’ и проиндексировать командой:
porcula index full ...новые настройки...
Работа
После индексации (или в другом окне) надо запустить приложение без параметров - заработает локальный веб-сервер.
По адресу http://127.0.0.1:8083/porcula/home.html будет страница “Книги”.
Для доступа с других устройств нужно указать внешний IP-адрес или все доступные адреса:
porcula server --listen=0.0.0.0:5678
Ограничение доступа, шифрование трафика, логирование запросов в приложении не предусмотрены. Если это необходимо, то надо поднять полноценный веб-сервер (nginx,apache) и настроить http reverse proxy для приложения.
Пользовательский интерфейс
Web UI примитивный: есть страница поиска книг, каталог жанров, каталог авторов (только фамилии).
Синтаксис поиска частично совпадает с синтаксисом Lucene, краткая подсказка - по кнопке “?”.
Есть поиск по подстроке, по регулярному выражению и нечёткий поиск (с различием не более одного символа), но все они работают медленно.
По кнопке “Читать” запускается встроенный просмотр книги в новой вкладке браузера.
Чтобы открыть FB2 сторонним приложением надо нажать на название книги и ткнуть на картинку-обложку.
Если размер экрана по горизонтали менее 1200 пикселей включается “мобильный” режим: часть информации скрыта. Но пока с совместимостью на разных устройствах беда.
OPDS
Кроме веб-интерфейса, для поиска книг можно использовать мобильное приложение, которое умеет работать по протоколу OPDS.
Пока проверено только на FBReader под Android.
Каталог нужно добавить вручную, указав URL http://сервер:порт/porcula/opds
Другие настройки
Кроме настроек индекса есть ещё несколько параметров командной строки, которые влияют на скорость индексации и потребление ресурсов. Эти параметры в индексе не сохраняются.
porcula --help
porcula index --help
porcula server --help
Откуда есть пошло имя porcula
wiki:Карликовая свинья - то есть это мелкое приложение, активно хрюкающее жёстким диском :-)