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?