ZKRINET Docs
Byggblock

Sök — fulltextsök med SQLite FTS5

På Zkrinet: lägg till blocket under Byggblock i panelen — ett klick, din egen kod rörs inte och en ögonblicksbild tas först. Installationsstegen nedan gäller om du kör PocketBase själv, till exempel efter en export.

Snabb fritextsökning i dina samlingar, med rankning (bm25) och utdrag där träffen är markerad. Sökningen respekterar samlingens egna regler: ingen får se en träff som hen inte hade fått se via PocketBase vanliga list-API.

Testat mot PocketBase 0.40.4 (SQLite 3.53.3, byggd med ENABLE_FTS5).

Installation

Kopiera pb_hooks/ och pb_migrations/ till din PocketBase och starta om. Samlingen zk_sok_installningar dyker upp i adminpanelen. Själva indexet ligger i två vanliga SQLite-tabeller (zk_sok_poster, zk_sok_index) som inte syns i adminpanelen.

Välj vad som ska vara sökbart

Skapa en rad i zk_sok_installningar per samling (bara superuser):

FältExempel
samlingartiklarSamlingens namn
falt["titel", "innehall"]Fält av typen text eller editor (HTML-taggarna tas bort innan indexering)
aktivpåAv = samlingen är inte sökbar

Indexet byggs direkt när raden sparas, och hålls sedan i synk automatiskt när poster skapas, ändras och raderas. Dolda fält (hidden) går inte att välja — utdragen skulle annars visa dem. Görs ett fält dolt i efterhand slutar det sökas direkt.

Bygg om hela indexet (t.ex. efter import direkt i databasen):

POST /api/zk/sok/bygg-om              (superuser)  alla samlingar
POST /api/zk/sok/bygg-om?samling=x    (superuser)  en samling

Söka från appen

const res = await pb.send("/api/zk/sok", { query: { q: "grafikkort", samling: "artiklar", antal: 20, sida: 1 } })
// res = { traffar: [...], mer: true|false, sida, antal }
for (const t of res.traffar) {
  t.samling   // "artiklar"
  t.id        // postens id
  t.falt      // fältet som matchade bäst
  t.utdrag    // "…om <mark>grafikkort</mark> här…" — HTML-säkert, se nedan
  t.poang     // högre = bättre träff
  t.post      // hela posten, precis som list-API:t hade visat den
}

Frågespråket

Svenska

Tokenizern är unicode61 remove_diacritics 0. Standardvalet i många guider (remove_diacritics 1/2) viker å/ä/ö till a/o — då hittar "får" även "far" och "hål" även "hal". Här gör det inte det:

SökningHittarHittar inte
fårfårfar
hålhålhal
körkörkor
åsa, ÅSAÅsa

Skiftläge viks (även Å/å). Priset: den som söker ole hittar inte "Olé" — accenttecken måste skrivas som i texten. För svensk text är det rätt avvägning.

Säkerhet

Vill du begränsa hur ofta någon får söka, slå på PocketBase inbyggda rate limit (Inställningar → Rate limiting) med regel för /api/zk/sok.

Begränsningar

Testa

./bank.py sok

14 tester: svenska tecken (får/far, hål/hal, kör/kor, Åsa/åsa, prefix), rankning, utdrag (HTML-säkert, editor-fält tvättade), ägarregel (A/B/gäst, jämfört mot PocketBase egen list-API), att svaret inte läcker andras träffar, låsta och publika samlingar, dolda fält, injektion i frågespråket, synk vid ändring/radering, misslyckad batch, validering av inställningar, ombyggnad (även med föräldralösa indexrader), borttagen samling, sidor. Säkerhetsskydden är mutantverifierade: varje skydd har brutits med flit och fångats av minst ett test.