Pretraga za sajt i web shop: Typesense, Elasticsearch

Pretrage je tema ovog članka, od ograničenja koje koči do predaje posla.

Pretraga za sajt zamjenjuje polje koje vraća “nema rezultata” engineom koji prašta greške u kucanju, razumije riječi koje kupci zaista upisuju i filtrira katalog onako kako ljudi kupuju. U web shopu, na dokumentaciji ili u velikoj arhivi sadržaja pretraga je često najkraći put od namjere do stranice koja donosi prihod ili odgovor. Ugrađena pretraga WordPressa, WooCommercea, Magenta ili SQL upit sa LIKE to rijetko radi kada katalog naraste.

U CodeWizu projektujemo i gradimo pretragu za web stranice, online prodavnice i aplikacije. Biramo engine prema vašim podacima i timu, modeliramo indeks, držimo ga usklađenim sa izvorom istine i isporučujemo sučelje sa autocompleteom, filterima i stranicom rezultata koja ostaje brza i na telefonu. Dodajemo i analitiku upita, tako da se relevantnost popravlja iz stvarnih pretraga.

Kod teme pretrage alati otvorenog koda su prvi izbor kada odgovaraju poslu.

Usluga je za prodavnice u kojima kupci ne mogu naći proizvode za koje znaju da ih prodajete, izdavače i dokumentaciju sa hiljadama stranica, B2B kataloge sa cijenama po kupcu, i timove čija je sadašnja pretraga spora, slijepa na pravopis ili se ne da podesiti bez programera u bazi.

Pretrage kreće od sistema koji već radi, a ne od praznog šablona.

Pretrage: Lupa i olovka na otvorenoj knjizi pored malog globusa

Pretraga za sajt na Typesenseu

Typesense je engine koji na većini prodavnica i sadržajnih projekata uzimamo prvi. Open source je, typo tolerance radi odmah, a održavanje je jednostavno: jedan binary, HTTP API i indeks u memoriji koji na uobičajene upite o proizvodima odgovara za milisekunde. Možete ga držati na vlastitom serveru ili koristiti Typesense Cloud ako klaster ne želite da vodite sami.

Rad na temi pretrage ostaje u vašem repozitoriju i na vašoj infrastrukturi.

Sinonimi (“patike” i “tenisice”, ili “trainers” i “sneakers”), zakačeni rezultati i težine polja daju osobi koja vodi shop uticaj na rezultate bez punog reindeksiranja. Kolekcije se mijenjaju preko aliasa, pa obnova indeksa ne gasi pretragu.

Gdje Typesense odgovara

  • Katalozi proizvoda od nekoliko hiljada do nekoliko miliona SKU-ova, uključujući varijante, cijene i zalihe.
  • Pretraga sajta i dokumentacije gdje je praštanje grešaka u kucanju važnije od teškog jezičkog analizatora.
  • Geo pretraga za prodavnice, poslovnice ili oglase, i vektorska pretraga kada kasnije na ključne riječi dodate semantičko poklapanje.
  • Timovi koji žele open-source i predvidljiv hosting, a ne račun koji raste sa svakim otkucajem.

Šta isporučujemo

  • Šemu kolekcije: koja polja se pretražuju, koja su facet, a koja služe samo za sortiranje ili filter.
  • Pipeline indeksiranja iz CMS-a, prodavnice ili baze, sa inkrementalnim izmjenama i sigurnim punim reindeksom.
  • Sučelje pretrage: autocomplete, stranicu rezultata, filtere, highlight i prazno stanje koje nudi ispravku ili čest upit.
  • Skupove sinonima, pravila kuriranja i mali admin put kojim tim poslije lansiranja sam podešava relevantnost.

Zvanična dokumentacija Typesensea je referenca za API. Za starije shopove koji i dalje pretražuju SQL-om pisali smo posebno o tome kako Typesense stack uvodimo u starije projekte.

Elasticsearch i OpenSearch za velike i složene indekse

Elasticsearch i OpenSearch su pravi alat kada model upita preraste jednostavniji engine: duboke agregacije, pravila relevantnosti, analitika logova pretrage ili indeks koji već živi u ELK okruženju. Teži su za rad. Klaster traži plan kapaciteta, nadogradnje, snapshotove i nekoga ko razumije shardove i mappinge.

  • OpenSearch je Apache-2.0 distribucija koju biramo kada licenca mora ostati permisivna. Pokriva full-text pretragu, agregacije, dashboarde i alerting.
  • Elasticsearch je dostupan kao izvorni kod pod Elastic licencom i AGPL-om. Elastic Cloud skida posao oko klastera; licenca i skup funkcija su ustupak koji tada prihvatate.
  • Mapping i analizatori se projektuju unaprijed. Kasnija promjena tipa polja znači reindeks, pa mapping tretiramo kao šemu, a ne kao nešto što se otkriva u produkciji.
  • Alias usmjerava aplikaciju na jedan indeks dok se sljedeći gradi, i tako reindeksiramo velike kataloge bez prekida.

Ovaj nivo preporučujemo kada stack već vodite, kada trebaju funkcije koje lakši engine nema, ili kada pretraga i analitika logova pripadaju istom mjestu. Za tipičan web shop operativni trošak teško se opravdava. OpenSearch dokumentacija je referenca koju pratimo za dizajn klastera i upita.

Meilisearch i Algolia

Meilisearch i Algolia stoje na dva kraja iste ideje: pretraga koja djeluje trenutno, sa relevantnošću koja je dobra i prije ručnog podešavanja. Razlika je u tome ko vodi servere i kako se cijena obračunava.

  • Meilisearch je open source (MIT), pisan za brzinu i kratak API. Odgovara sadržajnim sajtovima, imenicima i katalogima kojima trebaju typo tolerance i filteri bez vođenja Elasticsearcha. Meilisearch Cloud je tu ako želite hostovanu varijantu.
  • Algolia je hostovana usluga. Relevantnost, analitika i zrela UI biblioteka su uključene, a klaster ne krpite. Cijena prati zapise i operacije, pa prometan autocomplete na velikom katalogu treba procijeniti prije nego što se obavežete.
  • Trenutni rezultati na oba enginea učitavaju se tako da ne blokiraju prvi prikaz stranice. Biblioteka pretrage kreće kada posjetilac fokusira polje, a ne na svakom učitavanju.
  • Čist izlaz je bitan. Šemu indeksa i sučelje držimo iza malog sloja, tako da je kasniji prelazak sa hostovanog enginea na vlastiti projekat, a ne prepisivanje prodavnice.

Dokumentacija Meilisearcha dobro pokazuje koliko API pretrage može biti mali. Algoliju biramo kada tim izričito želi upravljanu uslugu i kada je trošak korištenja proračunat; u ostalim slučajevima podrazumijevani izbor je open-source engine na infrastrukturi kojom upravljate.

Prolazi u biblioteci sa označenim policama koje vode do kategorija knjiga

Faceted search i autocomplete

Engine je pola proizvoda. Druga polovina je interakcija: posjetilac ukuca tri slova, vidi smislene prijedloge, dođe do rezultata i suzi ih po brendu, veličini, cijeni ili temi. Faceted search i autocomplete su mjesto na kojem većina instaliranih pluginova za pretragu stane.

Filteri koji prate način na koji ljudi biraju

  • Faceti dolaze iz stvarnih atributa (brend, kategorija, raspon cijene, dostupnost, tip sadržaja), sa brojevima koji se ažuriraju kako se mijenjaju ostali filteri. Odabir jednog brenda ne smije izbrisati ostale brendove sa liste.
  • Cijena je raspon, a ne pedeset kvadratića. Zaliha i “na akciji” su jasni filteri, a proizvodi kojih nema na stanju se izostavljaju ili guraju naniže po pravilu koje vi odredite.
  • Na telefonu filteri žive u panelu koji prije primjene pokazuje koliko će rezultata trenutni odabir vratiti.
  • URL drži upit i filtere, pa se prikaz rezultata može podijeliti, sačuvati i indeksirati tamo gdje to želite.

Autocomplete koji pomogne i onda se skloni

Koristan skup prijedloga miješa proizvode, kategorije i dopune upita, ističe poklopljena slova i može se koristiti tastaturom. Zahtjevi se kratko odgađaju (debounce) i otkazuju dok posjetilac i dalje kuca. Nisu jedini put do rezultata: Enter i dalje otvara punu stranicu. Kratak Typesense upit za tu stranicu izgleda ovako:

{ "q": "plava kosulja", "query_by": "name,description,brand", "query_by_weights": "4,1,2", "facet_by": "brand,size,color,in_stock", "filter_by": "in_stock:true", "sort_by": "_text_match:desc,popularity:desc", "num_typos": 2, "per_page": 12 }

Analitika pretrage i podešavanje relevantnosti

Pretraga postaje bolja samo ako vidite šta su ljudi ukucali. Bilježimo upit, broj pogodaka, skup filtera i koji je rezultat otvoren, a lične podatke držimo van tog loga. Sedmični pogled na upite bez rezultata obično vrijedi više od još jedne runde nagađanja sinonima.

  • Nula rezultata postaje sinonim, normalizovan token ili rupa u sadržaju. Ako pedeset ljudi traži proizvod koji ne prodajete, to je signal za asortiman, a ne bug u pretrazi.
  • Najčešći upiti dobijaju zakačene rezultate za proizvode ili stranice koje želite na vrhu, a loši rezultati se sakrivaju.
  • Jezik ovog regiona traži izričitu odluku. Bosanski, hrvatski, srpski i crnogorski miješaju ijekavicu i ekavicu (“mlijeko” i “mleko”), a kupci izostavljaju dijakritike (“kosulja” umjesto “košulja”). Typo tolerance pokriva dio toga; skupovi sinonima i normalizovano polje pokrivaju ostatak. Ćirilične upite, tamo gdje tu publiku imate, pri indeksiranju prevodimo u latinicu.
  • Signali rangiranja ostaju razumljivi: prvo poklapanje teksta, zatim zaliha, popularnost ili marža, uz zapisano pravilo da sljedeća izmjena bude namjerna.
  • Bez tihog odmaka. Sinonimi i pinovi žive u konfiguraciji koju možemo pregledati, a ne na ekranu plugina koji niko ne pamti.

Koji engine odgovara

Univerzalnog pobjednika nema. Ovo je poređenje koje radimo prije nego što ikakav indeks nastane:

EngineLicencaKo ga vodiNajbolje odgovaraNa šta paziti
TypesenseGPL-3.0vi ili Typesense CloudProdavnice i sadržajni sajtovi kojima treba typo tolerance bez klasteraVrlo velike analitičke agregacije bolje leže OpenSearchu
OpenSearchApache-2.0vi ili managed uslugaSloženi upiti, veliki indeksi, pretraga uz observabilityRad na klasteru, promjene mappinga, memorija
ElasticsearchElastic License i AGPLvi ili Elastic CloudTimovi koji su već na Elasticu, ili funkcije vezane za tu platformuUslovi licence i plan nadogradnji
MeilisearchMITvi ili Meilisearch CloudBrza, jednostavna pretraga sadržaja i srednjih katalogaManje poluga nego u Elasticsearchu za neobičnu relevantnost
AlgoliaKomercijalni SaaSAlgoliaTimovi koji žele hostovanu pretragu i plaćaju po korištenjuCijena pri velikom broju upita ili zapisa, i zavisnost od hosta

Ugrađena pretraga baze i dalje ima mjesto: blog sa nekoliko desetina tekstova ne treba poseban engine. To i kažemo kada je tako.

Indeksiranje, sync i svježi rezultati

Sjajni indeks jučerašnjeg kataloga je bug koji vidi kupac. Cijene, zalihe i neobjavljene stranice moraju se brzo ažurirati, a puna obnova mora biti moguća kada se šema promijeni.

  • Prodavnica ili CMS ostaje izvor istine. Indeks pretrage je izvedeni model za čitanje, ponovo građen iz tog izvora.
  • Kreiranja, izmjene i brisanja idu kroz red, pa spor indeks ne blokira checkout ni dugme za snimanje u editoru.
  • Noćno usklađivanje poredi brojeve u izvoru sa indeksom i popravlja odmak.
  • Polja po jeziku su odvojena, sa sinonimima po jeziku, tako da njemački upit slučajno ne rangira preko engleskog opisa.
  • Tajne, cijene po kupcu i nacrti ostaju van svakog indeksa koji javni API ključ može čitati. Javni ključevi pretrage ograničeni su na operacije koje preglednik smije zvati.

Engine na vlastitom serveru traži backup, metrike i, za veliki katalog, zaseban server. Taj teret smještamo na isti način kao u vodiču za deployment na DigitalOceanu, AWS-u, Hetzneru i bare metalu. Kada katalog pritiska bazu, pretraga je putanja čitanja koja joj skida teret; vodič za sharding i particioniranje pokriva stranu baze.

Najčešće greške u pretrazi koje ispravljamo

  • Pretraga sa LIKE '%term%', koja ne može koristiti običan indeks i usporava kako tabela raste.
  • Nema tolerancije na greške, pa i “reciever” i izostavljen dijakritik vraćaju prazno.
  • Indeksiraju se nacrti, skrivene kategorije ili proizvodi kojih nema, pa se pojave u prijedlozima.
  • Brojevi faceta ignorišu trenutne filtere i nude opcije koje vode na nulu rezultata.
  • Veliki JavaScript paket pretrage na svakoj stranici, u trci sa sadržajem zbog kojeg je posjetilac došao.
  • Nema zapisa upita, pa se relevantnost poslije dana lansiranja više ne popravlja.

Pretraga za sajt: od čega zavisi cijena

Procjenu dajemo nakon uvida u katalog, platforme i to koliko rezultati moraju biti svježi. Pokretači cijene su isti:

  • Veličina kataloga, broj jezika i koliko su podaci o proizvodima čisti.
  • Engine i to da li hostujete sami ili plaćate hostovanu uslugu.
  • Koliko izvora treba indeksirati i da li izmjene stižu webhookom, redom ili noćnim fajlom.
  • Sučelje: prosta stranica rezultata, ili autocomplete, facet, merchandising i analitika.
  • Naknadno podešavanje: sinonimi, pinovi i pregled upita bez rezultata poslije lansiranja.

Hostovane usluge na izradu dodaju naknadu po korištenju. To ulazi u preporuku, da mjesečni račun ne bude iznenađenje.

Šareni redovi knjiga uredno složeni na drvenim policama

Kako radimo

  1. Upoznavanje: prolazimo katalog, jezike, sadašnju pretragu i upite ili primjedbe koje već znate.
  2. Plan: biramo engine, definišemo šemu, put sinhronizacije i sučelje, i dogovaramo šta “dobri rezultati” znače za vaše najvažnije upite.
  3. Izrada: indeksiramo staging kopiju, radimo autocomplete, filtere i stranicu rezultata, i spajamo izmjene iz izvornog sistema.
  4. Testiranje: provjeravamo greške u kucanju, dijakritike, prazne rezultate, kombinacije filtera, promjene zaliha i brzinu sučelja na telefonu.
  5. Puštanje: prebacujemo promet, pratimo greške i upite bez rezultata, a staru pretragu kratko držimo za rollback.
  6. Podrška: sinonime i rangiranje podešavamo iz stvarnih upita i engine držimo ažurnim.

Zašto CodeWiz

  • Open-source na prvom mjestu: Typesense, OpenSearch i Meilisearch su podrazumijevani izbor. Hostovana usluga je odluka koju objašnjavamo, a ne polazna pretpostavka.
  • Prodavnica i indeks zajedno: radimo WooCommerce, Magento, PrestaShop, Shopify i aplikacije po mjeri, pa se sync poklapa sa načinom na koji se katalog zaista mijenja.
  • Obim po mjeri: jedna kolekcija na jednom serveru kada je to dovoljno, klaster kada podaci to traže.
  • Fer cijene: vrhunski razvoj bez vrhunskih cijena, iz Banje Luke, na daljinu sa klijentima iz regiona i svijeta.
  • Ostatak stacka u istim rukama: API-ji, redovi, hosting i performanse su kod istog tima – više o CodeWizu.

Često postavljana pitanja

Koliko košta pretraga za sajt?

Typesense ili Meilisearch indeks na postojećoj prodavnici, sa autocompleteom i nekoliko filtera, fokusiran je posao. Višejezični katalozi, više izvora podataka, pravila merchandisinga i OpenSearch klaster na vlastitom serveru traju duže. Hostovani enginei imaju i svoju mjesečnu naknadu. Procjenu dobijate nakon što vidimo katalog.

Typesense, Elasticsearch ili Algolia?

Za većinu prodavnica i sadržajnih sajtova krećemo od Typesensea ili Meilisearcha. OpenSearch ili Elasticsearch zaslužuju mjesto kada trebaju teške agregacije ili taj stack već vodite. Algolia odgovara timovima koji žele pretragu u potpunosti hostovanu i koji su provjerili cijenu korištenja. Šema koju projektujemo ne zaključava izbor zauvek.

Hoće li novi engine usporiti sajt?

Indeks radi kao zaseban servis, a dobro složen upit brži je od SQL skeniranja tabele proizvoda. Rizik je frontend: teška instant-search biblioteka na svakoj stranici. Taj kod učitavamo kada posjetilac koristi pretragu, pa ostatak stranice ostaje lagan. Googleova smjernica je LCP ispod 2,5 sekunde; pretraga ne treba biti ono što to pokvari.

Možete li zamijeniti WooCommerce ili Magento pretragu?

Možemo. Indeksiramo proizvode, kategorije i sadržaj sa platforme, održavamo tok izmjena zaliha i cijena i mijenjamo formu pretrage i šablon rezultata u temi. Platforma ostaje mjesto na kojem uređujete proizvode.

Kako rješavate upite na bosanskom, hrvatskom i srpskom?

Računamo na izostavljene dijakritike, ijekavicu i ekavicu, a latinicu uzimamo kao osnovu. Gdje publika traži ćirilicom, ti upiti se normalizuju na ista polja indeksa. Liste sinonima su dio predaje, pa ih vaš tim može proširivati.

Spremni za pretragu koja nešto nađe?

Recite nam šta posjetioci danas ne uspijevaju pronaći i na kojoj platformi sadržaj živi. Mi ćemo predložiti plan u kojem pretraga za sajt odgovara katalogu. Kontaktirajte nas da prođemo detalje, ili pogledajte ostatak naših usluga razvoja.