- računa se samo 8 najboljih riječi
- dovoljan je jedan od više pojmova
- kod jednog pojma: može izgubiti proizvode
- računaju se sve odgovarajuće riječi
- svi pojmovi moraju odgovarati
- kod jednog pojma: često pronalazi znatno više
Na Shopware forumima stalno se ponavljaju ista pitanja: Zašto pretraga vraća proizvode koji uopće ne sadrže traženu riječ? Zašto jedno jedino „e“ odlučuje hoće li proizvod biti pronađen? I zašto I pretraga pronalazi više od ILI pretrage? Odgovori se nalaze u izvornom kodu. Detaljno smo ga pregledali i ovdje objašnjavamo što se događa: bez potrebe za znanjem programiranja, ali s dovoljno detalja da razumijete ponašanje Vaše trgovine.
Ovo vrijedi za standardnu pretragu Shopwarea 6 (temeljenu na MySQL-u, bez Elasticsearcha/OpenSearcha). Pročitali smo kod verzije 6.7.13.0 (logika je nepromijenjena do 6.7.14.1) i sve primjere u nastavku testirali u trgovini sa Shopwareom 6.7.14.1.
Primjeri su namjerno na njemačkom: problem složenica najviše pogađa njemački jezik, a njemačke trgovine najveća su Shopware publika.
Korak 1: Pri indeksiranju nastaje rječnik
Shopware ne pretražuje tekstove Vaših proizvoda pri svakom upitu. Umjesto toga, pri indeksiranju gradi rječnik ključnih riječi iz svih polja koja su pod Settings → Search (Postavke → Pretraga) označena kao pretraživa. Tekstovi se pritom rastavljaju na riječi4:
- sve se pretvara u mala slova,
- riječi se razdvajaju na razmacima i interpunkciji,
- crtice, podvlake, točke, „+“ i „@“ ostaju („Montage-Feinstrickhandschuhe“ ostaje jedna riječ),
- složenice se ne rastavljaju. Za Shopware je „Arbeitshandschuhe“ jedna jedina riječ.
Svaka riječ sprema se dvaput: jednom normalno i jednom unatrag („arbeitshandschuhe“ i „ehuhcsdnahstiebra“). Zašto, pokazuje korak 3.
Korak 2: Od pojma za pretragu nastaju uzorci
Kada kupac upiše „stuhl“, Shopware ne traži samo točno tu riječ. Generira nekoliko uzoraka sa zamjenskim znakovima, u kojima pojedina slova smiju nedostajati ili biti bilo koja. Za „stuhl“ to su, među ostalima1:
| Uzorak | Značenje | Pronalazi npr. |
|---|---|---|
s__hl… | s, bilo koja dva znaka, hl, zatim bilo što | stahl, stuhl |
stu… | počinje s „stu“ | stuhl, stufe, stuck |
stu_l… | stu, bilo koji jedan znak, l | stuhl |
To je Shopwareov oblik tolerancije na tipfelere i objašnjava zašto „Stuhl“ pronalazi i „Stahl“. To nije „prava“ fuzzy pretraga, ali nije ni nulta tolerancija. Ista tolerancija djeluje i na kraju riječi: u našoj testnoj trgovini pretraga za „stuhl“ vratila je i proizvode s engleskom riječi „Steel“ u nazivu, jer „steel“ završava kao „stuhl“, samo s dva zamijenjena slova („st“, bilo koja dva znaka, „l“).
Dva posebna slučaja:
- Riječi s brojkama (npr. „m12“) traže se bez zamjenskih znakova, ali na bilo kojem mjestu u riječi: „m12“ pronalazi i „din-m12“ i „m12x40“.
- Vrlo kratke riječi (do 2 znaka) traže se samo kao početak riječi.
Korak 3: Početak ili kraj, nikad sredina
Uzorci se uspoređuju s rječnikom dvaput: s normalnim riječima i s riječima spremljenima unatrag2. Normalni uzorci pronalaze riječi koje tako počinju. Uzorci unatrag pronalaze riječi koje tako završavaju.
Ono što se nikad ne pronalazi: pojam koji se nalazi samo u sredini duže riječi. Upravo je to bio slučaj u jednoj često raspravljanoj temi na forumu:
| Pretraga | Naziv proizvoda „Arbeitshandschuhe“ (radne rukavice) | Zašto |
|---|---|---|
| „handschuhe“ (rukavice) | ✅ pronađeno | „arbeitshandschuhe“ završava na „handschuhe“ |
| „handschuh“ (rukavica) | ❌ nije pronađeno | nije ni na početku ni na kraju |
| „arbeit“ (rad) | ✅ pronađeno | „arbeitshandschuhe“ počinje s „arbeit“ |
| „strick“ (pletivo) u „Montage-Feinstrickhandschuhe“ | ❌ nije pronađeno | nalazi se u sredini |
U njemačkom, s mnoštvom složenica (Holzschrauben, Bürostuhl, Edelstahlspüle: vijci za drvo, uredska stolica, sudoper od nehrđajućeg čelika), ovo je najčešći razlog za „Proizvod postoji, zašto ga pretraga ne pronalazi?“.
Korak 4: Računa se samo 8 najboljih riječi
Često mnogo riječi iz rječnika odgovara uzorcima. Shopware ih tada ocjenjuje, prije svega prema tome koliko su slične pojmu pretrage (Levenshteinova udaljenost: koliko slova treba promijeniti?). „stahl“ je samo jedno slovo udaljen od „stuhl“ i zato dobiva dobru ocjenu.
Važno: za ILI pretragu Shopware zatim koristi samo 8 najbolje ocijenjenih riječi1. Ako mnogo riječi ima istu ocjenu, što se kod složenica često događa, o tome koje će biti tih 8 praktički odlučuje abecedni redoslijed. Proizvodi koji bi odgovarali tek preko devete ili desete riječi ispadaju.
I nasuprot ILI pretrazi: suprotno od očekivanog
Pod Settings → Search (Postavke → Pretraga) možete odabrati moraju li se kod više pojmova pojaviti svi (I) ili samo jedan (ILI). Očekivali biste da ILI uvijek pronalazi više. No dva se načina razlikuju i po tome koliko odgovarajućih riječi uzimaju u obzir3:
| ILI pretraga | I pretraga | |
|---|---|---|
| Riječi koje se uzimaju u obzir | samo 8 najboljih ukupno | sve odgovarajuće, po pojmu |
| Više pojmova | dovoljan je jedan | svi moraju odgovarati |
| Posljedica kod jednog pojma | može izgubiti proizvode | često pronalazi znatno više |
Jedan je trgovac na forumu izvijestio da je pretraga za „mull“ (gaza) s ILI pretragom pronašla 34 proizvoda, a s I pretragom 846. Upravo taj efekt.
Praktični savjet: ako Vaši kupci često upisuju samo jednu riječ, a imate mnogo složenih naziva proizvoda, isprobajte I pretragu.
Zašto se pojavljuju proizvodi koji ne sadrže traženu riječ
- Nevidljiva polja: riječ se nalazi u pretraživom polju koje se u trgovini ne prikazuje, npr. u oznakama (tags), dodatnim pojmovima za pretragu, nazivima kategorija, svojstvima ili kod proizvođača.
- Pogoci preko zamjenskih znakova: uzorak poput
stu…odgovara potpuno drugoj riječi u jednom od tih polja. - Zastarjeli indeks: rječnik se zapisuje pri indeksiranju. Nakon promjena na proizvodima ili u konfiguraciji pretrage ponovno izgradite indeks pretrage.
Koja je riječ pronašla neki proizvod, vidite u Live searchu pod Settings → Search (Postavke → Pretraga), zajedno s bodovima rangiranja.
Što se promijenilo u 6.7.14, a što nije
- 6.7.14.0: napomene uz izdanje navode bolje rangiranje kada se cijeli pojam pretrage pojavljuje kao fraza u proizvodu. To vrijedi samo za pretragu s Elasticsearchom/OpenSearchom, ne za standardnu pretragu5.
- Ocjenjivanje varijanti: dosad su se bodovi svih varijanti proizvoda zbrajali, pa su proizvodi s mnogo varijanti uvijek završavali na vrhu. To je ispravljeno (pull request #19139)6 i prema Shopwareu stiže s jednom od sljedećih verzija. Mijenja redoslijed, ne i koji se proizvodi pronalaze.
Logika početka i kraja, ograničenje na 8 riječi i ponašanje I/ILI pretrage dakle ostaju.
Što možete podesiti
Bez programiranja, pod Settings → Search (Postavke → Pretraga):
- Pretraživa polja i bodovi rangiranja: provjerite koja se polja pretražuju. Nevidljiva polja s mnogo riječi (dugi opisi, oznake) često uzrokuju neočekivane pogotke.
- I/ILI pretraga: isprobajte obje s Vašim najčešćim pojmovima.
- Minimalna duljina pojma: kod vrijednosti 3 pojmovi poput „xl“ se ignoriraju.
- Isključeni pojmovi: riječi koje samo stvaraju šum.
- Dodatni pojmovi za pretragu po proizvodu: upišite važne dijelove riječi, npr. „handschuh“ kod „Arbeitshandschuhe“. To je najučinkovitija poluga protiv problema složenica, ali kod velikih asortimana znači mnogo održavanja.
- Ponovno izgradite indeks pretrage nakon svake promjene.
Uz razvoj: logika uzoraka može se prilagoditi dekoracijom servisa (service decoration). To je zahvat u tok jezgre koji treba provjeriti pri svakom ažuriranju.
Kada standardna pretraga dosegne svoje granice
Za manje asortimane s jasnim nazivima proizvoda standardna pretraga uz dobro održavanje često je dovoljna. Teško postaje kod mnogo složenica, stručnih pojmova, šifri artikala i varijanti. Tada postoje tri puta:
- Povezati Elasticsearch/OpenSearch i sami konfigurirati analizu (npr. rastavljanje složenica, n-grame). Moćno, ali traži znanje i održavanje.
- Sustavno održavati pojmove za pretragu, npr. putem uvoza. Pomaže, ali se loše skalira.
- Koristiti specijaliziranu pretragu.
Ovo posljednje radimo s Eyworom: njemačke složenice rastavljaju se uz pomoć rječnika i svode na korijen riječi, pa „handschuh“ pronalazi i „Arbeitshandschuhe“. Uz to dolaze semantička pretraga za upite na jeziku kupaca i posebna obrada šifri artikala. Kada se prelazak isplati, a kada ne, iskreno smo opisali u članku Standardno pretraživanje vs. AI pretraživanje. Zašto su pretrage bez rezultata tako skupe, pročitajte u članku Problem nula rezultata.
Izvori
- Uzorci i ocjenjivanje: ProductSearchTermInterpreter.php (Shopware 6.7.13.0) – https://github.com/shopware/shopware/blob/v6.7.13.0/src/Core/Content/Product/SearchKeyword/ProductSearchTermInterpreter.php ↩
- Upit nad normalnim riječima i riječima unatrag: KeywordLoader.php (Shopware 6.7.13.0) – https://github.com/shopware/shopware/blob/v6.7.13.0/src/Core/Content/Product/SearchKeyword/KeywordLoader.php ↩
- I/ILI filter: ProductSearchBuilder.php (Shopware 6.7.13.0) – https://github.com/shopware/shopware/blob/v6.7.13.0/src/Core/Content/Product/SearchKeyword/ProductSearchBuilder.php ↩
- Rastavljanje na riječi: Tokenizer.php (Shopware 6.7.13.0) – https://github.com/shopware/shopware/blob/v6.7.13.0/src/Core/Framework/DataAbstractionLayer/Search/Term/Tokenizer.php ↩
- Napomene uz izdanje 6.7.14.0, odjeljak „Whole-phrase product-search matches rank higher“ – https://github.com/shopware/shopware/blob/v6.7.14.0/RELEASE_INFO-6.7.md ↩
- Ocjenjivanje varijanti: Pull request #19139 – https://github.com/shopware/shopware/pull/19139 ↩




