Table of Contents

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:

  1. SQL prefilter po pigeonhole principu — sužava kandidate, ne može promašiti tačan rezultat
  2. 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 + 1 ako je rastojanje veće od max (rani izlaz).

PigeonholeFragments(string, int)

Deli token na d+1 delova za SQL prefilter.

PIGEONHOLE PRINCIP: ako se q i w razlikuju za najviše d izmena, a q podelimo na d+1 disjunktnih delova, onda d izmena može „pokvariti" najviše d delova — bar jedan deo ostaje netaknut i mora doslovno postojati u w.

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.