Class Fuzzy
- Namespace
- UsluzionicaServer.Infrastructure.Search
- Assembly
- UsluzionicaServer.dll
Tolerancija na sitne greške u kucanju: frizerr, frizre, vodoinstalter.
Radi u dva koraka, jer nijedan sam nije upotrebljiv:
- SQL prefilter po pigeonhole principu — sužava kandidate, ne može promašiti tačan rezultat
- OSA rastojanje in-memory nad tim suženim skupom
public static class Fuzzy
- Inheritance
-
Fuzzy
- Inherited Members
Fields
- MinScore
Skor ispod ovoga se odbacuje — bolje nula rezultata nego smeće.
Methods
- MaxDistance(int)
Dozvoljeno rastojanje po dužini tokena.
Kratke reči imaju mali prag namerno: na dužini 4, rastojanje 1 spaja „kuca", „kuka", „muka", „ruka" — nepovezane pojmove. Tolerancija ima smisla tek kad reč ima dovoljno konteksta da greška ostane greška.
- Osa(string, string, int)
Optimal String Alignment — Damerau-Levenshtein bez pravila o višestrukoj transpoziciji.
OSA umesto čistog Levenshteina jer je zamena mesta dva susedna slova („frizre" ↔ „frizer") najčešća greška pri kucanju. Levenshtein je naplaćuje kao DVE izmene (brisanje + umetanje), pa bi na dužini 6, gde je prag 1, taj par ispao iz tolerancije. OSA je naplaćuje kao jednu.
Vraća
max + 1ako je rastojanje veće odmax(rani izlaz).
- PigeonholeFragments(string, int)
Deli token na
d+1delova za SQL prefilter.PIGEONHOLE PRINCIP: ako se
qiwrazlikuju za najvišedizmena, aqpodelimo nad+1disjunktnih delova, ondadizmena može „pokvariti" najvišeddelova — bar jedan deo ostaje netaknut i mora doslovno postojati uw.Zato
WHERE SearchTitle LIKE '%fri%' OR LIKE '%zerr%'ne može promašiti pravi rezultat. Prefilter je korektan po konstrukciji, a ne heuristika koja „obično radi".Primeri: frizerr (7, d=1) → "fri" + "zerr" ; „frizer" sadrži "fri" ✓ frizre (6, d=1) → "fri" + "zre" ; „frizer" sadrži "fri" ✓ vodoinstalter (13,d=2) → "vodo"+"inst"+"alter" ; „vodoinstalater" sadrži "vodo" i "inst" ✓
- Similarity(string, string)
Koliko dobro token odgovara reči: 1.0 = identično, 0.0 = nepovezano.