Prebacili smo pretragu na Meilisearch: 500ms je postalo 35ms

Prebacili smo pretragu na Meilisearch: 500ms je postalo 35ms

Neko ukuca tri slova u vaše polje za pretragu, ne dobije ništa i ode. Nikada ne vidite kad se to desi. Vidite samo skok napuštanja u analitici nedeljama kasnije i okrivite landing stranicu.

Pretraga nije funkcija koju zalepite na kraju. Na sajtu prodavnice ili platformi za rezervacije to je radnja sa najvećom namerom koju neko može da uradi. Tačno vam govori šta hoće. Pustite ga da čeka, ili ga kaznite zbog jednog pogrešnog slova, i bacili ste prodaju koju ste već napola imali.

Do sada smo pretragu gradili za nekoliko proizvoda. Najviše smo naučili na aplikaciji za rezervaciju parking mesta. Evo šta smo promenili, šta je prvo puklo, i brojevi koji su presudili.

Počeli smo na bazi, kao i svi

Prva verzija te pretrage bila je upit nad bazom. Filteri, par spajanja, računanje udaljenosti, jedan ORDER BY. Radilo je. Neko vreme.

Onda se mapa napunila i prestalo je. Borili smo se da upit zadržimo ispod 500ms, a svaki filter koji bi korisnik dodao činio ga je težim. Pod opterećenjem je bilo gore. Možete se donekle izvući indeksima, probali smo, ali glancate pogrešan alat. Relaciona baza nije građena da rangira nejasan tekst i sortira deset hiljada tačaka po udaljenosti dok neko vuče mapu. Uradiće to. Neće to uraditi brzo.

To je iskrena verzija. Proveli smo nedelju dana čineći pogrešnu stvar malo manje sporom pre nego što smo priznali da je pogrešna.

Šta je Meilisearch zapravo

Meilisearch je pretraživač otvorenog koda napisan u Rustu. Nahranite ga dokumentima, izgradi indeks, odgovara na upite za nekoliko desetina milisekundi. Tolerancija na greške u kucanju je podrazumevano uključena: reč od pet znakova oprašta jednu grešku, reč od devet znakova oprašta dve, pa "tleefon" nalazi "telefon", a vi ne podešavate ništa. Faceted filteri, sinonimi i geopretraga su svi tu, iza čistog REST API-ja.

Broj koji je bitan je ispod 50ms. Ne najbolji slučaj u dobrom danu. Podrazumevano. To je cela razlika između pretrage koja deluje trenutno i pretrage koja deluje kao čekanje.

Neka ostane indeks, ne druga baza

Evo stava koji ću braniti. Meilisearch je vaš indeks za pretragu. Nije vaša baza. Ne dozvolite mu da sklizne u to.

Kada upit krene, Meilisearch vraća primarne ključeve dokumenata koji se poklapaju. To je sve. U Laravelu Scout uzima te ključeve i povlači pune zapise pravo iz vaše baze, jednim whereIn. Tražite u Meiliju, čitate iz Postgresa. Indeks i izvor istine ostaju odvojeni.

To smo uradili namerno, i uradio bih ponovo. Svako polje koje prekopirate u indeks je još jedno polje van vaše baze, u drugom sistemu, koje sada morate da obezbedite i držite u glavi. Ugurajte ceo model unutra i dešavaju se dve stvari: indeks se naduva i uspori, a vi ste tiho razbacali osetljive podatke po servisu koji je trebalo samo da nađe red. Stavite ono što pretrazi treba da poklopi i rangira. Ostalo ostavite u bazi, gde mu je mesto. Scout to čini najlakšim putem, što je retko i vredi ceniti.

Gde se isplatilo: mapa

Stranu sa punim tekstom skoro uzimate zdravo za gotovo dok ne naletite na ono što ona čisto rešava. Kod nas je to bila mapa.

Interakcija zvuči trivijalno a muka je dobro je napraviti. Spustite iglu, postavite radijus, dobijte svako slobodno mesto unutar njega, najbliže prvo, i držite to sveže dok gurate mapu okolo. Radijus ide do 8000 metara, pa je prometan kraj mnogo kandidata za sortiranje pri svakom malom pomeranju.

Meilisearch nosi geo iz kutije. Upišete _geo polje na svaki dokument, označite ga filtrabilnim i sortabilnim, i _geoRadius(lat, lng, meters) vam daje sve unutar kruga. Sortirajte po _geoPoint(lat, lng):asc i rezultati se vraćaju poređani po udaljenosti, svaki nosi _geoDistance u metrima. Bez PostGIS-a. Bez ručno pisane haversine formule zakopane u upit. Bez svađe sa planerom upita.

Prvo što je klijent primetio uopšte nije bila funkcija. Mapa je jednostavno delovala tečno. Pomeranje i pretraga prestali su da budu dva spora koraka i postali jedan pokret. Za to niko ne šalje zahvalnicu. Ljudi samo prestanu da odlaze, što je ista stvar merena drugačije.

Broj

Ovo je deo za skeptičnog inženjera, jer sam bio jedan.

Pre: onaj upit nad bazom, u borbi da ostane ispod 500ms, gori pod opterećenjem. Posle: 35ms u proseku. Ne probrani najbolji slučaj, prosek. Složen upit koji je nekad bio blizu pola sekunde sada odgovori pre nego što prst napusti mapu. To je više od desetostruko, i došlo je od premeštanja posla na alat građen za to, a ne od jačeg mučenja alata koji nije.

Ljudi pretpostavljaju da takav skok traži prepravku. Nije. Suština posla je skinuti opterećenje pretrage sa baze i staviti ga na mašinu koja ima jedan zadatak.

Indeks se sam drži usklađen

Uobičajena zamerka na poseban pretraživač je ona očigledna. Sad imate dva skladišta, i ona se razilaze.

Uz Laravel Scout to uglavnom nestaje. Dodate trait na Eloquent model, kažete koja su polja pretraživa, i Scout drži indeks svežim dok se redovi kreiraju, menjaju i brišu. Ažuriranja idu kroz vaš red poslova, pa indeksiranje nikad ne blokira veb zahtev. Meko brisanje je pokriveno. Iz dana u dan prestanete da o indeksu mislite kao o nečemu što održavate. Promenite zapis, indeks prati. To je poenta.

Gde ulaze vektori

Pun tekst sa tolerancijom na greške pokriva najveći deo onoga što ljudi ukucaju. Ali namera je neurednija od ključnih reči. U aplikaciji za parking ljudi traže izmešano: ulicu, oznaku, svojstvo mesta, ponekad i samo ime mesta. Takvi upiti ne leže uredno na tačnim rečima u vašim podacima, i nikakva tolerancija na greške ne spasava upit koji ne deli nijednu reč sa zapisom koji treba da pogodi.

Tu semantička pretraga zaslužuje svoje mesto. Od 1.3 Meilisearch čuva vektorske ugradnje pored vaših dokumenata i može da vodi hibridnu pretragu: poklapanje ključnih reči i poklapanje po značenju zajedno. Upit bez ijedne zajedničke reči ipak nađe zapis, jer su bliski po značenju. Ugradnje pravite modelom koji izaberete, Meili ih drži i pretražuje. Moj savet: prvo isporučite solidan pun tekst, semantiku dodajte odozgo kad se neuredni upiti počnu pojavljivati u logovima. Ništa ne čupate da biste stigli dotle.

Zašto se ovo vidi u prodaji

Prosto. Pretraga koja je spora, ili ne vrati ništa čim se neko zabuni, je curenje. Niko se ne žali. Ljudi odu, i nikad ne saznate zašto.

Od prelaska, pretraga bez rezultata znači da zaista nema odgovarajućeg zapisa. Ne jedno pogrešno slovo. Ne upit formulisan malo drugačije od podataka. To je cela igra. Polje treba da vrati ono što je čovek mislio, dovoljno brzo da nikad i ne pomisli na polje. Svaka pretraga koja nađe pravu stvar je čovek koji je ostao. Dobar deo onih koji ostanu, kupi.

Brza pretraga koja oprašta greške nikad ne deluje kao poluga rasta, jer je nevidljiva kad radi. Baš zato se preskače.

Gde ulazi Conimex IT

Ako je vaša pretraga na sajtu LIKE upit koji kažnjava greške, ili vam mapa štuca, ili su vam analitike pune pretraga koje su se vratile prazne, to je rešivo, i retko traži prepravku na koju se već spremate. Gradimo pretragu za prodavnice i veb aplikacije na Meilisearchu i Laravelu: pun tekst sa tolerancijom na greške i sinonimima, geopretraga za mape i lokaciju, čisto Scout indeksiranje koje prati vašu bazu, i hibridna semantička pretraga kad upiti moraju da pogode nameru a ne samo reči. Ako to zvuči kao curenje koje biste radije zatvorili, javite nam se i pogledaćemo šta vas pretraga tiho košta.

#Meilisearch#Laravel#Pretraga sajta#E-trgovina#Geopretraga#Performanse

Često postavljana pitanja

Da li je Meilisearch dobar izbor za pretragu na sajtu e-trgovine?

Da. Brza pretraga sa tolerancijom na greške i facetama, koja odgovori za manje od 50ms, tačno je to čemu služi, a to su stvari koje smanjuju stranice bez rezultata i napuštene pretrage, dva glavna razloga zašto ljudi odu bez kupovine.

Da li Meilisearch zamenjuje moju bazu?

Ne, i ne treba. Vraća primarne ključeve pogodaka, a pune zapise učitavate iz svoje baze. To je indeks pored vaše baze, ne zamena. Ostati odvojen je bolje za brzinu i za bezbednost.

Kako Meilisearch radi pretragu po lokaciji?

Geo je ugrađen. Koordinate na svaki dokument, filtrirajte po radijusu ili graničnom okviru, sortirajte po udaljenosti od tačke. Vraća udaljenost po pogotku, pa je "mesta u blizini, najbliže prvo" lako napraviti, bez PostGIS-a ili ručno pisanih upita za udaljenost.

Koliko je teško dodati Meilisearch u Laravel aplikaciju?

Nije mnogo. Scout ima prvorazredni Meilisearch drajver. Trait na model, imenujte pretraživa polja, i Scout drži indeks usklađen kroz vaš red poslova dok se podaci menjaju. Pravi posao je u finom podešavanju relevantnosti, ne u povezivanju.

Može li Conimex IT ovo da nam postavi?

Da, to je jedna od stvari koje radimo. Gradimo pretragu za prodavnice i veb aplikacije na Meilisearchu i Laravelu, od punog teksta i geo do hibridne semantičke pretrage, uz fino podešavanje relevantnosti i indeks usklađen sa vašim podacima. Pišite nam na [email protected] i recite nam šta vaša trenutna pretraga radi i gde vas žulja.

Imate projekat na umu?

Hajde da popričamo kako Conimex IT može da vam pomogne da osmislite, izgradite i objavite svoj sledeći proizvod.

Kontaktirajte nas