Přeskočit na obsah

Vyhledávač vracel přípravu místo výsledku

vlastní kód · vyhledávač
Sekcí v korpusu
1 883
Velikost
1,55 MB
Souborů
283
Index se staví
0,05 s

Teze: Fulltext nad vlastními dokumenty vracel na dotaz „jak to dopadlo“ přípravné materiály, ne výsledky. Oprava nebyla v algoritmu, ale ve struktuře dokumentů — a jeden zlepšovák to cestou zhoršil.

Problém

Na dotaz „shrň mi reklamace za poslední dobu s výsledky“ vracel vyhledávač přípravné dokumenty pojmenované po tématu. Závěry byly na konci dlouhých souborů, kam ořezávání nedosáhlo.

Co jsem zkusil a co z toho vyšlo

Zásah Výsledek
Substring matching nemá pojem relevance — vracelo, co bylo v souboru první
BM25 přes SQLite FTS5 správný směr: zvýhodní vzácné termíny (jméno, číslo, kód)
Váha na shodu v nadpisu zhoršilo to — přípravné dokumenty jsou pojmenované po tématu, takže vyhrávaly
Poziční prior (pořadí sekce v souboru) zabralo
Závěry nahoru + --stav jako vstupní bod zabralo nejvíc

Detaily, které rozhodly

  • Jednotkou je sekce markdownu, ne soubor a ne odstavec — s cestou nadpisů, aby bylo vidět, odkud úryvek je.
  • Diakritika se ignoruje (unicode61 remove_diacritics 2), jinak „Zaneta“ nenajde „Žanetu“.
  • Poziční prior je schválně malý. U vágního dotazu, kde jsou skóre namačkaná na sobě, rozhodne pozice; u konkrétního („752“) rozptyl BM25 pozici přebije.
  • Strop na soubor je adaptivní. Pevná hodnota škrtila domény s jedním velkým dokumentem.
  • Obří tabulkové sekce (timeline, jeden řádek i několik kB) se redukují na shodné řádky.
  • Strop výstupu 8 000 znaků. Při 13 kB slabý 27B model přehlédne klíčový řádek uprostřed.

Týž dotaz před a po

Dotaz: „jak dopadla reklamace, výsledek", táž doména, tytéž dokumenty.

Před — substring přes soubory. Vrátí seznam souborů, ve kterých se slovo někde vyskytuje. Bez pořadí podle relevance a bez informace, kde v souboru to je:

pipeline.md
archiv/[firma A]/Podklad - vzor 2.md
firmy/[firma B].md
firmy/[firma C].md
firmy/[firma D].md
firmy/[firma E].md
00-prehled.md
… 7 souborů

Čtenář — v tomhle případě model s omezeným kontextem — dostane sedm dokumentů, z nichž některé mají tisíce řádků, a závěr bývá na konci.

Po — BM25 nad sekcemi. Vrátí konkrétní sekce i s cestou nadpisů:

[firmy/[firma B].md] › Výsledek reklamace (31. 7. 2026) — ZAMÍTNUTO
[firmy/[firma D].md] › Průběh a výsledek (1/2026)
[firmy/[firma C].md] › Průběh jednání a výsledek (1–2/2026)
[firmy/[firma E].md] › Průběh jednání a výsledek (5/2026) › Dvě otázky…

Rozdíl není v tom, že by se našlo víc. Najde se totéž, ale rovnou to místo, kde odpověď je — a název sekce dopoví zbytek dřív, než se text vůbec načte. První výsledek nese odpověď přímo v nadpisu.

Rozměry (změřeno 2. 8. 2026)

doména sekcí velikost
work 650 402 kB
znalosti 476 490 kB
health 409 361 kB
cestování 345 324 kB
deník 3 2 kB
celkem 1 883 1,55 MB ve 283 souborech

Index se nikde neukládá. Staví se v paměti při každém spuštění — a trvá to 0,04 až 0,08 s i s vyřízením dotazu. Při téhle velikosti korpusu je jakákoliv cache jen další věc, která může být neaktuální: zdroj se mění ručně editací souborů a stará cache by tiše vracela smazaný text. Perzistentní index dává smysl až tam, kde stavba trvá déle než dotaz.

Poznámka k publikaci

Názvy firem v ukázce jsou nahrazené; struktura výstupu, počty i názvy sekcí jsou původní.

Co se pro to změnilo
  • vlastníreference/ref-search.py — fulltext BM25 nad dokumenty
  • FTS5unicode61 remove_diacritics 2
Souvisí — štítek „vyhledávání“