why argue with her when you can shut her down in the first one response and make her go "you got me there" ive been through it several times #quickwit
Zeebs: The handling by the Backs was great today Craig. Where did that come from? Craig: We got rid of some of the deadwood. #MunsterRugby 🤪🏉🥊 #QuickWit

When you work on live TV and ad-lib weather with no script, it's important to focus and have...

#Montana #TV #TVWeather #quick #wit #quickwit #weather #licenseplate #funny #Thursday

Универсальное индексирование и поиск файлов по содержимому и типу через REST API: мотивация, контекст, архитектура и практическое применение Bash-скрипта для комплексной обработки данных

Введение

В эпоху взрывного роста цифровых данных и резкого увеличения количества документов разного формата на пользовательских компьютерах и в корпоративных средах, задача эффективного поиска по содержимому файлов становится всё более актуальной. Современные специалисты и энтузиасты сталкиваются с необходимостью мониторинга и анализа большого числа документов, музыкальных файлов, исходного кода и других данных. Однако для организации поиска с учётом типов файлов и предоставления результатов через REST API существует потрясающий вакуум в наборе стандартных готовых инструментов.

Данная статья — детальное объяснение мотивации, проблематику текущего состояния вопроса, технический анализ существующих решений, проектирование и практическое руководство по использованию авторского Bash-скрипта для создания собственной системы индексирования и поиска по содержимому файлов с публикацией результата по удобному REST-интерфейсу.

***

Проблематика: отсутствует комплексное open source-решение

Классические подходы

В среде Linux и UNIX-подобных систем существует множество утилит для поиска по содержимому (grep, ack, ripgrep) и локального индексирования (Recoll, Tracker, DocFetcher). Однако у этих инструментов свои ограничения:

- grep и аналоги эффективны и быстры, но не масштабируются хорошо при работе с большими архивами и требуют явного перебора директорий вручную.
- Recoll предоставляет мощную индексацию и полнотекстовый поиск, умеет обрабатывать многие форматы документов — PDF, офисные файлы, вложения в почте, аудио-теги. Но Recoll — строго десктопный продукт, не предоставляет REST API для организации поиска в веб- или серверной инфраструктуре.
- DocFetcher, Tracker и прочие аналоги аналогично ориентируются на GUI и почти не интегрируются с внешними сервисами.
- Поисковые движки корпоративного класса (например, Solr, Elasticsearch) требуют существенной доработки, подготовки данных, и, зачастую, не поддерживают индексирование произвольных пользовательских файловых деревьев без сложной ETL-процедуры.


Ограничения веб-решений

В ряде случаев существуют онлайн- или self-hosted сервисы с веб-интерфейсом (например, Paperless-ngx для работы с PDF/сканами, Photoprism для фотографий, MeiliSearch, Quickwit для полнотекстового поиска). Но ни один из этих продуктов, за редким
исключением, не реализует сам весь «жизненный цикл» — от обхода локального диска до унификации метаданных и предоставления результатов через Rest API с учётом типа файлов.

Итог

Совокупность вышеописанных наблюдений приводит к пониманию: на практике отсутствует свободно распространяемое и интегрируемое решение, покрывающее такой сценарий целиком и эффективно.

***

Мотивация создания собственного инструмента

Организация цифровых архивов

Личный и рабочий опыт показал, что классическое хранение документов и мультимедийных файлов без надёжного поиска делает невозможным оперативную работу с ними. Случаи ежедневной необходимости найти свежий договор, техническую документацию, нужную mp3-композицию, фрагмент стихотворения, фрагмент кода из старого проекта встречаются повсеместно.

Безопасность и приватность

Зачастую использование облачных решений неприемлемо по соображениям приватности или необходимости полного контроля над инфраструктурой. Необходим локальный, но мощный инструмент.

Технологичность и расширяемость

Инструмент должен быть не только эффективен, но и расширяем, удобен для автоматизации и дальнейшей интеграции с другими платформами — веб-порталами, чат-ботами, поисковыми сервисами.

***

Архитектура решения: как построен Bash-скрипт

Основная идея

Идея — использовать сильные стороны уже существующих компонент:

- применять Recoll для обхода и индексации файлов с поддержкой сложных форматов;
- преобразовывать данные в формализованный JSONL;
- использовать современный Rust-поисковик Quickwit для хранения индекса и предоставления поиска через REST API;
- строить весь пайплайн без необходимости ручной работы, используя автоматические Bash-скрипты и стандартные Unix-утилиты.


Основные этапы

1. Индексация файлов с помощью Recoll
Recoll быстро проходит по всем каталогам, поддерживает детектирование формата и извлечение из него текстового содержимого, автоматически формирует метаданные (тип файла, путь, размер, краткий summary).
2. Преобразование выдачи Recoll в JSONL
Стандартный Bash-конвейер использует sed, чтобы парсить вывод Recoll и превращать каждую строку (mimetype, путь, summary, размер) в строку валидного JSON, пригодного для массовой загрузки в Quickwit.
3. Генерация и конфигурирование индекса Quickwit
Явно описывается mapping (динамическая схема), временные параметры и основная структура индекса в YAML-файле.
4. Ингест (импорт) данных в Quickwit
Осуществляется командой Quickwit CLI — принимается весь JSONL.
5. Поиск по REST API
После запуска поиска результаты стали доступны с фильтрацией по типу файла, содержимому или другим параметрам через стандартные HTTP-запросы.
6. Очистка/удаление индекса
Для повторной работы или экономии ресурсов предусмотрено автоматическое удаление созданного тестового индекса.

***

Примеp использования и пошаговый анализ скрипта

Инструкция по запуску

- Устанавливаете Recoll, Quickwit, jq.
- Запускаете скрипт с параметром пути до индексируемой директории:

./index-files-and-search.sh 'my-term'
- Система последовательно:
- Индексирует все файлы через Recoll;
- Парсит стандартный вывод поиска (одна строка — один файл) в JSONL;
- Создаёт YAML-конфиг для индекса Quickwit;
- Создаёт и наполняет индекс;
- Производит тестовые запросы по различным типам файлов с выводом путей найденных файлов;
- Очищает индекс.


Пример JSONL-строки

{"ftype":"application/pdf","fpath":"/home/user/docs/file.pdf","summary":"Some PDF summary","bytes":123456}

Поиск по типу и содержимому

Вызов к REST API (возвращает только пути подходящих файлов):

curl -ks 'http://localhost:7280/api/v1/file-index/search/?query=ftype:audio/ogg' | jq -r .hits[].fpath

***

Преимущества решения

- Полная кастомизация: любой формат вывода, структура метаданных, интеграция с любым внешним сервисом.
- Гибкость и открытость: легко изменить схемы, добавить новые форматы, использовать в CI/CD, cron-задачах.
- Скорость, масштабируемость, безопасность: Quickwit работает быстро даже на больших наборах данных, а всё хранится локально.
- REST API: доступ к поиску из любой точки и любого ПО.
***

Недостатки и ограничения

- Нет автоматической обработки бинарных вложенных форматов (например, архивы внутри архивов) — необходимо расширение скрипта.
- Текущий подход требует поддержки уникальных id файлов для предотвращения дублей.
- Пока отсутствует полноценный web-интерфейс — всё взаимодействие через CLI или curl.

***

Дальнейшее развитие

- Интеграция поддержки новых форматов (ZIP, TAR, DOCX, XLSX) через внешние утилиты или Rust-крейты.
- Генерация идентификаторов на основе хеша содержимого.
- Автоматизация обновления и удаления информации об удалённых/перемещённых файлах.
- Создание web-интерфейса или интеграция через Telegram/Slack бот.

***

Заключение

Создание комплексного инструмента для индексирования, парсинга и поиска файлов с выдачей результатов в формате REST API — шаг к универсальной экосистеме управления личными и корпоративными знаниями, которая не зависит от проприетарных облачных платформ.

Приведённый Bash-скрипт — отличный базис для расширения и кастомизации проекта практически под любую задачу анализа файловых архивов, и может послужить прототипом как для персональных, так и для командных или корпоративных решений.

#!/bin/bash

recollindex > /dev/null 2>&1

# Create JSONL
recollq -a $1 | grep bytes | \
sed -e "s/^\([^]]*\)\s\[file:\/\/\([^]]*\)\]\s\[\([^]]*\)\]\s\(.*\)\sbytes/{\"ftype\":\"\1\",\"fpath\":\"\2\",\"summary\":\"\3\",\"bytes\":\4}/" > files.jsonl

# Create the index config file.
cat << EOF > file-index.yaml
version: 0.7
index_id: file-index
doc_mapping:
mode: dynamic
indexing_settings:
commit_timeout_secs: 30
EOF

# Create index
./quickwit index create --index-config file-index.yaml > /dev/null 2>&1

# Ingest data
./quickwit index ingest --index file-index --input-path ./files.jsonl --force > /dev/null 2>&1

# Search
curl -ks 'http://localhost:7280/api/v1/file-index/search/?query=ftype:application/pdf' | jq -r .hits[].fpath
curl -ks 'http://localhost:7280/api/v1/file-index/search/?query=ftype:text/plain' | jq -r .hits[].fpath
curl -ks 'http://localhost:7280/api/v1/file-index/search/?query=ftype:text/markdown' | jq -r .hits[].fpath
curl -ks 'http://localhost:7280/api/v1/file-index/search/?query=ftype:audio/ogg' | jq -r .hits[].fpath
curl -ks 'http://localhost:7280/api/v1/file-index/search/?query=ftype:audio/flac' | jq -r .hits[].fpath
curl -ks 'http://localhost:7280/api/v1/file-index/search/?query=ftype:audio/mp3' | jq -r .hits[].fpath
curl -ks 'http://localhost:7280/api/v1/file-index/search/?query=ftype:audio/mp4' | jq -r .hits[].fpath

# Delete index
curl -XDELETE 'http://localhost:7280/api/v1/indexes/file-index' > /dev/null 2>&1
#index #search #quickwit #bash #sed #curl

I know I'm late, but I just found out #datadog bought #quickwit. A true viable self hosted alternative to Datadog. 🙃

I may still run locally, but I'm not hopeful it'll keep getting improvements. 😔

https://quickwit.io/blog/quickwit-joins-datadog

Quickwit joins Datadog | Quickwit

The unexpected journey of building a multi-petabyte scale search engine

Fascinating work on #paradedb use of #postgres block storage. 😎 So many great advantages of using native block storage.

Now I'm curious if work of #quickwit ends up converging here in the future. 🤔

https://www.paradedb.com/blog/block_storage_part_one

ParadeDB

Zero-ETL search and analytics for Postgres

ParadeDB

The November #syslog_ng newsletter is now on-line:

- A call for syslog-ng #testing

- Working with #Quickwit

- Huge improvements for syslog-ng in #macports

It is available at https://www.syslog-ng.com/community/b/blog/posts/the-syslog-ng-insider-2024-11-testing-quickwit-macports

The syslog-ng Insider 2024-11: testing; Quickwit; MacPorts

Dear syslog-ng users, This is the 125th issue of syslog-ng Insider, a monthly newsletter that brings you syslog-ng-related news. NEWS A call for syslog-ng testing After the last syslog-ng release, we started a campaign to close open issues on GitHub....

Last time we looked at how syslog-ng can send logs to #Quickwit using its #Elasticsearch compatible API. This time we are going to look at how to use the #OpenTelemetry protocol to send logs to Quickwit with #syslog_ng.

https://www.syslog-ng.com/community/b/blog/posts/sending-logs-to-quickwit-using-the-opentelemetry-destination-of-syslog-ng

#LogManagement

Sending logs to Quickwit using the OpenTelemetry destination of syslog-ng

Last time we looked at how syslog-ng can send logs to Quickwit using its Elasticsearch compatible API. This time we are going to look at how to use the OpenTelemetry protocol to send logs to Quickwit with syslog-ng. Before you begin On the syslog-ng ...

We are always looking for new ways to store log messages. #Quickwit is a new contender, designed for #log #storage, and among others, it also provides an #Elasticsearch-compatible #API.

https://www.syslog-ng.com/community/b/blog/posts/first-steps-with-quickwit-and-syslog-ng

#LogManagement

First steps with Quickwit and syslog-ng

We are always looking for new ways to store log messages. Quickwit is a new contender, designed for log storage, and among others, it also provides an Elasticsearch-compatible API. From this blog, you can learn about Quickwit, and how to forward log ...

#mastoAdmin

is it possible to use #quickwit as a search engine instead of #elasticSearch in Mastodon/GlitchSoc?