Fasetirano pretraživanje. Pronalaženje pravog puta: kako fasetirana navigacija utječe na SEO (prijevod). Kako poboljšati fasetiranu navigaciju

💖 Sviđa li vam se? Podijelite vezu sa svojim prijateljima

Moderni ljudi sve manje vremena pokušavaju potrošiti na kupovinu. Spori katalozi proizvoda tjeraju kupce, trgovina gubi kupce i dio zarade. Učinite svoju online trgovinu privlačnijom s tehnologijom facet Facet - tj. unaprijed definiran.

traži. Izradite fasetirane indekse i značajno ubrzajte pretragu proizvoda i rad cijelog kataloga. Napomena: Fasetirani mehanizam pretraživanja dostupan je od verzije 15.0.1 modula Information Blocks i integriran je s komponentom Komponenta je programski kod

, dizajniran u vizualnoj ljusci, obavljajući specifičnu funkciju modula za prikaz podataka u javnom dijelu. Možemo umetnuti ovaj blok koda na web-stranice bez izravnog pisanja koda. Pametni filtar Komponenta priprema filtar za odabir iz informacijskog bloka i prikazuje obrazac filtra za elemente filtriranja. Komponenta mora biti spojena prije komponente za prikaz kataloških elemenata, inače se popis elemenata neće filtrirati. Komponenta je standardna, uključena u distribuciju modula i sadrži tri predloška: .default , visual_horizontal i visual_vertical . (Posljednja dva predloška nisu podržana, ostaju radi održavanja kompatibilnosti.) U vizualnom uređivaču komponenta se nalazi duž staze.

Sadržaj > Katalog > Pametni filter

Komponenta pripada modulu Informacijski blokovi.

Saznajte više o fasetiranom pretraživanju

Pogledajmo primjer:

  • Idemo u internetsku trgovinu i u filteru odabiremo da nam treba crvena majica:
  • Bez fasetnog pretraživanja, filtar bi počeo iterirati kroz cijeli popis proizvoda kako bi spojio proizvod "majica" sa svojstvom boje "crvena", što bi oduzelo puno vremena ako postoji veliki broj proizvoda;

Ako postavite fasetirano pretraživanje, tada se kreiraju gotovi skupovi proizvoda za pretraživanje za određenu vrijednost svojstva (fasetirani indeksi), tj. opcije za moguće zahtjeve Na primjer, crvena majica kratkih rukava, svi crni pamučni proizvodi, haljine veličine XS itd. u pametnom filtru izračunavaju se unaprijed i rezultat se prikazuje odmah. Ova vrsta pretraživanja proizvoda puno je brža.

Trebaju li ponovno kreirati indekse aspekata?

Fasetirani indeksi ponovno se stvaraju automatski ili ih trebate ponovno ručno izraditi, ovisno o izvršenim radnjama:

Automatski Dodani novi ili uređeni postojeći proizvodi.
ne stvaraju nova svojstva.
Ručno Sustav će vas o tome obavijestiti porukom na vrhu stranica
upravni odsjek.
Dodani novi ili uređeni dijelovi kataloga.
Prilikom dodavanja novog ili uklanjanja nekretnine iz pametnog filtra.
Prilikom istovara robe, na primjer, iz 1C, ako roba stvara nova svojstva.

Fasetirano pretraživanje poboljšava izvedbu kataloga proizvoda. Za korištenje vam je potrebno:

  • Stvaranje fasetiranih indeksa za katalog proizvoda;
  • Pripazite na obavijesti o potrebi ručnog ponovnog stvaranja indeksa.
  • Ugrađeno fasetirano pretraživanje Ugrađeno u proizvod

    Fasetirano pretraživanje ugrađeno u internetsku trgovinu - interno pretraživanje - radi brzo u mnogim aspektima i ne opterećuje sustav.

    • Ugrađeno u proizvod
    • Vrlo brzo
    • Ne učitava stranicu
    • Glavni je dio API-ja infoblokova
    • Ne zahtijeva redizajn web stranice
    • Automatski ponovno indeksirano
    Zašto tako brzo?

    Klijentu se trenutno prikazuju unaprijed pripremljeni rezultati pretraživanja - za bilo koju kombinaciju parametara - aspekt. Sustav unaprijed izračunava aspekte za proizvod - sva moguća sjecišta tih svojstava u filtru. Ovi gotovi setovi za pretraživanje se zatim izdaju klijentima.

    Zašto se stranica ne učitava?

    U trenutku kada se rezultat izda klijentu, nema kalkulacija, jer je rezultat već spreman. Faseta za novi proizvod kreira se odmah kada se doda u prodajni katalog. Pretraživanje se automatski ponovno indeksira na temelju novih proizvoda i novih nekretnina.

    Prednosti za klijente

    Prednosti fasetirane pretrage Vaš klijent vrlo brzo pronalazi proizvod, lako se igrajući s postavkama filtera. Klijent ne čeka i rezultate dobiva odmah. Brzina pretraživanja ne ovisi o broju artikala u katalogu.


    Pametni filter 2.0

    Klijent brzo pronalazi proizvod

    Vaš klijent vrlo brzo pronalazi proizvod dosljednim sužavanjem upita za pretraživanje. I na svakom koraku odmah dobiva rezultate - popis proizvoda na zahtjev. Ne mora čekati da se njegov zahtjev obradi. Jer sustav je sve unaprijed izračunao moguće opcije, i jednostavno izdaje praznine. Postupno, online trgovina prikazuje sve manje i manje proizvoda kao rezultate. Ovi proizvodi sve su bliži zahtjevima kupaca.

    Interaktivnost i višedimenzionalnost

    Odabir proizvoda za kupca je kao igra. Klijent povlači parametre (cijena, težina), mijenja svojstva (boja, veličina), postavlja dodatne uvjete (marka, materijal, okus, itd.) - a sustav odmah preuređuje rezultate. U ovom slučaju može biti koliko god želite prilagodljivih parametara - njihov broj ne utječe na brzinu generiranja rezultata.

    Praktičnost i ljubaznost

    Uz fasetiranu navigaciju, čak i neiskusan korisnik može lako odabrati proizvod u trgovini. Manipuliranje alatima za pretraživanje vrlo je zgodno. Osim toga, sustav od kupca traži sve parametre po kojima može izabrati proizvod. Trgovina, takoreći, demonstrira klijentu glavna svojstva proizvoda.

    Klijent ne čeka na obradu zahtjeva!
    Na primjer, vaš klijent kupuje kameru. U početku, on označava samo 3 parametra u pametnom filtru: cijenu, marku, veličinu. Njegov aspekt uključuje 3 raskrižja, ima puno rezultata pretraživanja, ali klijent ih prima odmah. Klijent postavlja težinu - treba mu lagani gadget. Sustav mu odmah, bez odlaganja, daje manji popis robe. Klijent postavlja veličinu zaslona, ​​zatim specificira potrebnu funkcionalnost. Ispred njega su željena roba.


    Brzina pretraživanja

    Brzina pretraživanja je važna Brzina pretraživanja utječe na broj obavljenih kupnji

    Ništa ne iritira kupca više od problema s pronalaženjem proizvoda na vašoj web stranici. Klijent će otići u druge trgovine ako predugo traži. Čak i ako vaša trgovina sadrži veliki izbor proizvode i mnoge alate za njihovo filtriranje. Klijent možda neće dobiti rezultate zahtjeva.


    Video vodič: Zašto fasetirano pretraživanje značajno ubrzava pametni filter
    Korištenje "fasete" ubrzava pretragu unutar trgovine za red veličine. U ovom slučaju brzina ne ovisi o broju elemenata u imeniku.

    Zašto je pretraga tako spora?
    Traženje proizvoda na prodajnom izlogu može trajati znatno dulje od uobičajenog vremena učitavanja stranice. Pogotovo ako postoji veliki broj proizvoda u trgovini i svojstva tih proizvoda. Upit za pretraživanje na mnoge načine stvara mnogo poziva bazi podataka i značajno opterećuje stranicu. Ako ima puno klijenata i zahtjeva, pretraga se znatno usporava.

    Brzina rada je impresivna! Rezultati testiranja za verziju 15.0 proizvoda na tri kategorije kataloga koji sadrže 500 tisuća artikala pokazali su da u usporedbi s prethodnim verzijama:
    • Komponenta pametnog filtera – ​​15 puta brže!
    • Komponenta kataloga – ​​5 puta brže!
    Inteligencija pretraživanja ostaje konstantna!
    Brzo i bez "fasete"! Proizvod neprestano radi na ubrzanju samih komponenti kataloga. Usluga “Site Speed” pokazuje značajno povećanje brzine od verzije do verzije!

    Rekonstrukcija

    Provodi se stalna rekonstrukcija indeksiranja i rezultata pretraživanja. Algoritam za indeksiranje sadržaja se prerađuje i ubrzava. Kvaliteta prezentacije rezultata pretraživanja je poboljšana - posebno je smanjen "šum". Programeri planiraju prikazati personalizirane podatke za trenutnog klijenta u rezultatima pretraživanja.

    Za programere: Transparentnost API-ja


    Prethodni pogled

    "Faset" je transparentan za API "Faset" ugrađen u proizvod je transparentan za API. To je glavni dio API-ja infoblokova. Stoga njegovo korištenje ne zahtijeva dodatne napore za programere. Također nema potrebe za redizajnom stranica.
    • Ubrzavanje metode CIBlockElement::GetList
    • Potpuna integracija s pametnim filtrom
    GetList sada radi brže jer automatski povezuje "fasetu" s funkcijom. Na D7 se pojavio i zaseban API.

    Potpuna integracija s pametnim filtrom

    Sada, kada postavljate postavke u administrativnom dijelu, za svojstva proizvoda ne možete samo označiti aktivnost - želite li ili ne sudjelovati u pametnom filteru. Prosljeđivanjem svojstva pametnom filtru možete odmah odabrati kako ih prikazati. U kojem obliku bi se nekretnina trebala prikazati klijentima: gumbi, veličine, klizači, padajuće liste, liste s odabirom boja itd.



    Prikaži svojstvo u pametnom filtru

    Može se prilagoditi!

    Pametni filter sada izgleda ljepše. Programeri mogu jednostavno prilagoditi i dodatno prilagoditi njegov izgled.

    U današnjoj lekciji pokušat ćemo ponovno stvoriti imitaciju fasetirane pretrage pomoću Javascripta. Pretpostavljam da već znate što je fasetirano pretraživanje ako čitate ovaj vodič, u suprotnom ga proguglajte ili pogledajte Amazon ili moj Demo.

    Prvo trebamo biblioteku github.com/eikes/facetedsearch. Preuzmite ga i povežite datoteku facetedsearch.js s našim projektom. Također će nam trebati biblioteke jQuery i Underscore.

    Odricanje od odgovornosti: razumijem da JQ više nije kolač, ali ga koristim kao poznati sintaktički šećer, možete ga prepisati za vama poznatije biblioteke ili u vanilla JS.

    Dakle, prvo, napravimo jednostavno označavanje s povezanim ovisnostima:

    Dokument // Ovdje ćemo prikazati fasetirane filtre // I ovdje će biti naši elementi

    Sada trebamo opisati postavke naše aplikacije i izraditi predložak za prikaz elemenata niza koje ćemo sortirati pomoću faseta:

    $(function())( var item_template = // Opišite predložak "" + " " class="img-responsive">" + ", " + "

    " + "" + ", " + ", " + "

    " + "

    " + ""; postavke = ( stavke: example_items, aspekti: ( // Navedite kategorije aspekta "category" : "Koja kategorija", "continent" : "Koji kontinent", "language" : "Programski jezik")), selektor rezultata: "#results", // DOM element gdje prikazujemo rezultate facetSelector: "#facets", // DOM element za facete resultTemplate: item_template, paginationCount: 8, // Broj elemenata po stranici orderByOptions: ("firstname": " First name ", "lastname": "Prezime", "category": "Kategorija", "RANDOM": "Nasumično"), facetSortOption: ("kontinent": ["Sjeverna Amerika", "Južna Amerika"]) ) $. facetelize (postavke);

    Pa, zapravo stvorite sam JSON niz s elementima za prikaz u našem pretraženom pretrazi u JS-u:

    Var items = [ ( "firstname": "Mary", "lastname": "Smith", "imageURL": "http://lorempixel.com/150/150/cats/2", "description": "Sed Ea Amet. Stet Voluptua. Nonumy Magna Takimata", "kategorija": "Miš", "jezik": ["Smalltalk", "XSLT"], "kontinent": "Afrika" ​​("ime": "Patricia ", "prezime": "Johnson", "URL slike": "http://lorempixel.com/150/150/cats/3", "opis": "Ut Takimata Sit Aliquyam Labore Aliquyam Sit Sit Lorem Ipsum Rebum ." , "kategorija": "Lav", "kontinent": "Sjeverna Amerika", ... ];

    Ja bih ovaj niz stavio u zasebnu JS datoteku koja bi se dinamički generirala, na primjer iz baze podataka.

    To je sve, dobivamo fasetirano pretraživanje u JavaScriptu i možemo ga prilagoditi. Zatim pružam prevedenu dokumentaciju biblioteke, gdje možete vidjeti okidače koji su vam potrebni.

    Značajke dokumentacije

    Dvije funkcije se izvoze u jQuery imenski prostor.

    facetelize Koristi se za pokretanje fasetirane pretrage s danim postavkama.

    facetUpdate Može se koristiti ako želite eksterno promijeniti stanje pretraživanja faceta.

    Postavke objekta

    stavke: Niz stavki koje će se filtrirati i sortirati u procesu.

    aspekti: Objekt čiji ključevi odgovaraju ključevima i vrijednostima elementa je zaglavlje za taj aspekt. Stavke će se filtrirati na temelju vrijednosti koju imaju za ove ključeve.

    orderByOptions: Slično aspektima, osim što se ovi parovi ključ-vrijednost koriste samo za sortiranje. Kada je tipka RANDOM omogućena, rezultati se mogu nasumično raspoređivati.

    FasetSelector: Ovo je selektor koji se koristi za pronalaženje DOM čvora iz kojeg se odabiru filteri faseta.

    Selektor rezultata: Ovo je selektor koji se koristi za pronalaženje DOM čvora gdje se prikazuju rezultati.

    resultTemplate: Niz koji koristi predložak Underscore za renderiranje svakog elementa iz niza stavki. Sljedeći atributi dodani su svakom elementu, koji se također mogu koristiti u predlošku: batchItemNr, batchItemCount i totalItemCount.

    stanje: Ovaj objekt pohranjuje trenutne filtre, sortira: currentResult i druge. Možete dati niz orderBy ili objekt filtera da ih unaprijed postavite.

    enablePagination: Booleova vrijednost za omogućavanje paginacije i gumba "učitaj više", zadana vrijednost true .

    paginationCount: Ako je paginator omogućen, postavlja broj elemenata po stranici, zadano je 50.

    facetSortOption: Koristite ovu funkciju za promjenu redoslijeda elemenata faceta. Uzima objekt čiji ključevi odgovaraju imenima i vrijednostima aspekata u niz vrijednosti aspekata, koji se mogu rasporediti redoslijedom kojim želite. Ovaj primjer sortirat će kontinente drugačijim redoslijedom, dodajući stavke koje nisu uključene u polje abecednim redom:

    FacetSortOption: ("kontinent": ["Sjeverna Amerika", "Južna Amerika"])

    Dostupno je još nekoliko predložaka, pogledajte izvorni kod facetedsearch.js da biste vidjeli sve dostupne opcije predložaka.

    Događaji

    Možete se vezati za neke događaje koji bi trebali slati obavijesti kada se neke radnje dogode. Da bismo to učinili koristimo jquery sustav događaja:

    facetuicreated: ovu funkciju možete povezati s DOM element settings.facetSelector koji bi trebao biti obaviješten kada se izradi korisničko sučelje.

    facetedsearchresultupdate: ovu funkciju možete povezati s DOM elementom settings.resultSelector kako biste bili obaviješteni o rezultatima ažuriranja.

    facetedsearchfacetclick: Ovaj događaj se pokreće kada se klikne na aspekt i aktivira se na elementu settings.facetSelector. Koji prima id aspekta kao argument.

    facetedsearchorderby: Ovaj se događaj pokreće kada se klikne element sortiranja na element settings.facetSelector. Uzima redoslijed ID-a kao argument.

    $(settings.resultSelector).bind("facetedsearchresultupdate", function())( // učini nešto, možda ));

    Brzo smo pogledali instalaciju i osnovnu sintaksu PINQ-a, priključka LINQ-a na PHP. U ovom ćemo članku pogledati kako koristiti PINQ za simulaciju značajke fasetnog pretraživanja u MySQL-u.

    U ovom članku nećemo pokriti sve aspekte fasetnog pretraživanja. Zainteresirani mogu potražiti odgovarajuće informacije na internetu.

    Tipično fasetirano pretraživanje funkcionira ovako:

    • Korisnik unosi ključnu riječ ili nekoliko ključnih riječi za pretraživanje. Na primjer, "usmjerivač" za traženje proizvoda u kojima se riječ "usmjerivač" pojavljuje u opisu, ključnim riječima, nazivu kategorije, oznakama itd.
    • Stranica vraća popis proizvoda koji odgovaraju ovim kriterijima.
    • Stranica nudi nekoliko poveznica za prilagodbu vaših pojmova za pretraživanje. Na primjer, može vam omogućiti da odredite određene proizvođače usmjerivača ili postavite raspon cijena ili druge značajke.
    • Korisnik može nastaviti specificirati dodatne kriterije pretraživanja kako bi dobio skup podataka od interesa.

    Fasetirano pretraživanje prilično je popularno i moćan alat koji se može vidjeti na gotovo svim web stranicama e-trgovine.

    Nažalost, fasetirano pretraživanje nije ugrađeno u MySQL. Dakle, što bismo trebali učiniti ako još uvijek koristimo MySQL, ali želimo korisniku dati ovu priliku?

    S PINQ-om, koji ima sličan, snažan i jednostavan pristup, možemo postići isto ponašanje kao da koristimo druge motore baza podataka.

    Proširenje demo iz prvog dijela

    Napomena: sav kod iz ovog dijela, kao i iz prvog dijela, nalazi se u repozitoriju.

    U ovom ćemo članku proširiti demonstraciju iz 1. dijela sa značajnim poboljšanjem u obliku faceted pretraživanja.

    Počnimo s index.php dodavanjem sljedeće retke:

    $app->get("demo2", function () use ($app) ( global $demo; $test2 = new pinqDemo\Demo($app); return $test2->test2($app, $demo->test1 ($aplikacija)); $app->get("demo2/facet/(key)/(value)", funkcija ($key, $value) use ($app) ( global $demo; $test3 = new pinqDemo\Demo($app); return $test3->test3($app, $demo->test1($app), $key, $value ));

    Prva ruta nas vodi na stranicu za pregled svih unosa koji odgovaraju traženju ključna riječ. Kako bi primjer bio jednostavan, odabiremo sve knjige iz tablice book_book. Također će prikazati rezultirajući skup podataka i skup poveznica za određivanje kriterija pretraživanja.

    U stvarnim aplikacijama, nakon klika na takve poveznice, svi filtri aspekta prilagodit će se graničnim vrijednostima dobivenog skupa podataka. Korisnik će tako moći sekvencijalno dodavati nove uvjete pretraživanja, na primjer, prvo odabrati proizvođača, zatim odrediti raspon cijena itd.

    Ali u ovom primjeru nećemo implementirati ovo ponašanje - svi će filtri odražavati granične vrijednosti​​izvornog skupa podataka. Ovo je prvo ograničenje i prvi kandidat za poboljšanje u našoj demonstraciji.

    Kao što možete vidjeti u gornjem kodu, stvarne funkcije nalaze se u drugoj datoteci pod nazivom pinqDemo.php. Pogledajmo odgovarajući kod koji pruža značajku fasetiranog pretraživanja.

    Klasa aspekta

    Prvo, kreirajmo klasu koja predstavlja aspekt. Općenito, aspekt treba sadržavati nekoliko svojstava:

    • Podaci na kojima radi ($data)
    • Ključ po kojem se vrši grupiranje ($key)
    • Vrsta ključa ($type). Može biti jedno od sljedećeg:
      • navedite cijeli niz za točno podudaranje
      • navedite dio niza (obično početni) za pretraživanje po uzorku
      • označavaju raspon vrijednosti za grupiranje prema rasponu
    • ako je vrsta ključa raspon vrijednosti, morate definirati korak vrijednosti da odredite donju i gornju granicu raspona; ili ako je tip dio niza, morate navesti koliko će se prvih slova koristiti za grupiranje ($range)

    Grupiranje je najkritičniji dio aspekta. Sve skupne informacije koje aspekt može vratiti ovise o kriterijima grupiranja. Obično su najčešće korišteni kriteriji pretraživanja "Cijeli niz", "Dio niza" ili "Raspon vrijednosti".

    Prostor imena classFacet ( koristite Pinq\ITraversable, Pinq\Traversable; class Facet ( public $data; // Izvorni skup podataka public $key; // polje po kojem se grupira javni $type; // F: cijeli red; S: početni nizovi ; R: public $range; // igra ulogu samo ako $type != F ... public function getFacet() ($filter = ""; if ($this->type == "F") / / cijeli red ( ... ) elseif ($this->type == "S") // početak retka ( ... ) elseif ($this->type == "R") // raspon vrijednosti ​( $ filter = $this->data ->groupBy(function($row) ( return floor($row[$this->key] / $this->range) * $this->range; )) -> select(function (ITraversable $data) ( return ["key" => $data->last()[$this->key], "count" => $data->count()]; )); return $ filtar; ) ) )

    Glavna funkcija ove klase je vraćanje filtriranog skupa podataka na temelju izvornog skupa podataka i svojstava aspekta. Iz zakonika je jasno da za različite vrste koriste se računi razne načine grupiranje podataka. U gornjem kodu pokazali smo kako bi kod mogao izgledati ako grupiramo podatke prema rasponu vrijednosti u koracima navedenim u $range.

    Postavljanje aspekta i prikaz izvornih podataka

    Javna funkcija test2($app, $data) ( $facet = $this->getFacet($data); return $app["twig"]->render("demo2.html.twig", array("facet" = > $facet, "data" => $data)); privatna funkcija getFacet($originalData) ( $facet = array(); $data = \Pinq\Traversable::from($originalData); // 3 različita primjera stvaranja objekte aspekta i vrati aspekte $filter1 = new \classFacet\Facet($data, "author", "F" $filter2 = new \classFacet\Facet($data, "title", "S", 6)); ; $filter3 = new \classFacet($data, "price", "R", $facet[$filter1->key] = $filter2->getFacet(); ); $facet[$filter3->key] = $filter3->getFacet();

    U metodi getFacet() radimo sljedeće:

    • Pretvorite izvorne podatke u Pinq\Traversable objekt za daljnju obradu
    • Mi stvaramo tri aspekta. Aspekt 'autor' će grupirati prema polju autora i implementirati grupiranje prema cijelom redu; aspekt 'naslov' - po naslovnom polju s grupiranjem po dijelu retka (po prvih 6 znakova); aspekt 'cijena' - po polju cijene s grupiranjem po rasponu (u koracima od 10)
    • Na kraju izdvajamo aspekte i vraćamo ih u funkciju test2 kako bi se mogli poslati u predložak za prikaz
    Izlazni aspekti i filtrirani podaci

    U većini slučajeva filtri će biti prikazani kao linija i vodit će vas do prikaza filtriranog rezultata.

    Već smo izradili rutu ("demo2/facet/(ključ)/(vrijednost)") za prikaz rezultata pretraživanja s aspektima i filtriranje veza.

    Ruta uzima dva parametra, ovisno o ključu po kojem se filtrira i vrijednosti za taj ključ. Ispod je prikazana funkcija test3 koja je vezana za ovu rutu:

    Test javne funkcije3($app, $originalData, $key, $value) ( ​​​​$data = \Pinq\Traversable::from($originalData); $facet = $this->getFacet($data); $filter = null; if ($key == "author") ( $filter = $data ->where(function($row) use ($value) ( ​​​​return $row["author"] == $value; )) ->orderByAscending( function($row) use ($key) ( return $row["price"]; )) ) elseif ($key == "price") ( ... ) else //$key== naslov ( .. . ) return $app["twig"]->render("demo2.html.twig", array("facet" => $facet, "data" => $filter) )

    U osnovi, ovisno o ključu, primjenjujemo filtriranje (anonimna funkcija u naredbi where) prema proslijeđenoj vrijednosti i dobivamo sljedeći skup filtriranih podataka. Također možemo postaviti redoslijed filtriranja podataka.

    Na kraju, prikazujemo neobrađene podatke (zajedno s filtrima) u predlošku. Ova ruta koristi isti obrazac koji smo koristili u "demo2".

    Traka za pretraživanje

      (% za k, v u aspektu %)
    • ((k|veliko slovo))
      • (% za vv u v %)
      • ((vv.broj))((vv.ključ))
      • (%endfor%)
      (%endfor%)

    Moramo zapamtiti da su aspekti koje generira naša aplikacija ugniježđeni nizovi. Na prvoj razini, to je niz svih aspekata, au našem slučaju tri su (autor, naslov, cijena).

    Svaki aspekt ima polje ključ-vrijednost, tako da ga možemo iterirati koristeći uobičajene metode.

    Primijetite kako gradimo URL-ove za naše veze. Koristimo i ključ vanjske petlje (k) i ključeve unutarnje petlje (vv.key) kao parametre za rutu ("demo2/facet/(ključ)/(vrijednost)"). Veličina nizova (vv.count) koristi se za prikaz u predlošku.

    Prva slika prikazuje izvorni skup podataka, a druga slika je filtrirana prema rasponu cijena od 0 do 10 USD i razvrstana po autoru.

    Sjajno, uspjeli smo simulirati fasetirano pretraživanje u našoj aplikaciji!

    Prije dovršetka ovog članka, moramo konačno pogledati naš primjer i odrediti što se može poboljšati i koja ograničenja imamo.

    Moguća poboljšanja

    Općenito, ovo je vrlo jednostavan primjer. Upravo smo prošli osnovna sintaksa i koncepte te ih implementirao kao radni primjer. Kao što je prethodno navedeno, imamo nekoliko područja koja bi se mogla poboljšati radi veće fleksibilnosti.

    Moramo implementirati kriterije pretraživanja "preklapanja", budući da nas trenutni primjer ograničava na mogućnost primjene filtriranja pretraživanja samo na izvorni skup podataka; ne možemo primijeniti fasetirano pretraživanje na već filtrirani rezultat. Ovo je najveći napredak koji mogu zamisliti.

    Ograničenja

    Fasetno pretraživanje implementirano u ovom članku ima ozbiljna ograničenja (koja se također mogu primijeniti na druge implementacije fasetnog pretraživanja):

    Svaki put dohvaćamo podatke iz MySQL-a

    Ova aplikacija koristi okvir Silex. Kao i svaki okvir s jednom ulaznom točkom kao što su Silex, Symfony, Laravel, njegova datoteka index.php (ili app.php) se poziva svaki put kada se ruta analizira i izvršavaju se funkcije kontrolera.

    Ako pogledate kôd u našem index.php, primijetit ćete da sljedeći redak koda:

    $demo = novi pinqDemo\Demo($app);

    poziva se svaki put kad se prikaže stranica aplikacije, što znači da se svaki put izvode sljedeće linije koda:

    Demonstracija razreda ( privatne $books = ""; javna funkcija __construct($app) ( $sql = "odaberite * iz redoslijeda book_book po ID-u"; $this->books = $app["db"]->fetchAll($sql ;)

    Hoće li biti bolje ako ne koristimo framework? Pa, unatoč činjenici da razvoj aplikacija bez okvira nije dobra ideja, mogu reći da ćemo naići na iste probleme: podaci (i stanje) se ne spremaju između različitih HTTP zahtjevi. Ovo je temeljna karakteristika HTTP-a. Ovo se može izbjeći korištenjem mehanizama predmemoriranja.

    Neke smo sačuvali SQL upiti koristeći aspekte. Umjesto prosljeđivanja jednog upita odabira za dohvaćanje podataka i tri grupna upita s odgovarajućim klauzulama where, pokrenuli smo samo jedan upit where i upotrijebili PINQ za dobivanje agregiranih informacija.

    Zaključak

    U ovom smo dijelu implementirali mogućnost fasetnog pretraživanja zbirke knjiga. Kao što sam rekao, ovo je samo mali primjer, koji ima prostora za poboljšanje, a koji ima niz ograničenja.

    U ovom članku (razina webmastera - napredni) govorit ćemo o tzv. intersectingu na različite načine. "fasetirana" navigacija. Kako biste pojednostavili asimilaciju materijala, preporučujem da prođete kroz članak Wikipedije "Klasifikacija aspekata" i publikacije na Engleski jezik(ali sa slikama!) "Dizajnirajte bolju fasetiranu navigaciju za svoje web stranice."

    Fasetirana navigacija s filtriranjem po boji ili Raspon cijena može biti koristan za vaše posjetitelje, ali je često štetan u pretraživanju zbog činjenice da stvara mnogo kombinacija adresa s dvostrukim sadržajem. Zbog duplikata tražilice neće moći brzo skenirati stranicu za ažuriranje sadržaja, što posljedično utječe na indeksiranje. Kako bismo umanjili ovaj problem i pomogli webmasterima da fasetirano navigacijsko pretraživanje učine ugodnijim, željeli bismo:

    Idealno za korisnike i Google pretraživanje

    Čisti put do stranica proizvoda/članaka:

    URL prikaz za stranicu kategorije:
    http://www.example.com/category.php?category=gumasti-bomboni

    Predstavljanje URL-a specifičnog za proizvod:
    http://www.example.com/product.php?item=swedish-fish

    Neželjeni duplikati uzrokovani fasetiranom navigacijom

    Ista stranica dostupna je s različitih web adresa:

    Kanonska stranica



    URL: example.com/product.php? item=swedish-fish

    Duplicirana stranica



    URL:example.com/product.php? item=swedish-fish&category=gumeni-bomboni&price=5-10


    kategorija=gumeni-bomboni&okus=kiselo&cijena=5-10

    greške:

    • Besmisleno za Google jer korisnici rijetko pretražuju [marmelada po cijeni od 9:55 dolara].
    • Besmisleno za web indeksiranje, koji će pronaći istu stavku ("voćna salata") sa stranica nadređenih kategorija (bilo "Slatko" ili "Kiselo Gumasto").
    • Negativna točka za vlasnika stranice, jer su zahtjevi za indeksiranje razrijeđeni brojnim verzijama iste kategorije.
    • Negativna točka za vlasnika stranice, jer je beskorisna i dodatno opterećuje propusnost mjesto
    Prazne stranice:


    URL: example.com/category.php? kategorija=gumeni-bomboni&okus=kiselo&cijena=preko-10

    greške:

    • Kôd za tražilice vraća se netočno (u ovom slučaju stranica bi trebala vratiti kod 404)
    • Prazna stranica za korisnike


    Najgora rješenja (neprilagođena pretraživanju) za fasetiranu navigaciju

    Primjer br. 1: Nestandardni parametri koriste se kao dio URL-a: umjesto toga zarezi i zagrade ključ=vrijednost&:

    • primjer.com/kategorija? [ kategorija:gumasti-bomboni ][ sortiraj:cijena-niska-visoka ][ sid:789 ]
    • primjer.com/kategorija?kategorija , gumeni bomboni , sortiranje , nisko do visoko , sid , 789
    Kako da:
    example.com/category?category=gummy-candy&sort=low-to-high&sid=789

    Primjer #2: Korištenje direktorija ili putova datoteka umjesto parametara na popisima vrijednosti koje ne mijenjaju sadržaj stranice:
    primjer.com/c123 /s789/ proizvod?švedska-riba
    (gdje je /c123/ kategorija, /s789/ ID sesije, što ne mijenja sadržaj stranice)

    Dobra odluka:

    • example.com /gumene-bombone/ proizvod?item=swedish-fish&sid=789 (direktorij, /gumene-bombone/, mijenja sadržaj stranice na smislen način)
    Najbolja odluka:
    • example.com/product?item=swedish-fish&category=gummy-candy&sid=789 (URL parametri daju veću fleksibilnost tražilicama da odrede kako učinkovito indeksirati)
    Alatima za indeksiranje je teško razlikovati korisne vrijednosti (kao što je "gummy-candy") od beskorisnih (kao što je "SESSIONID") kada su te vrijednosti postavljene izravno u staze veza. S druge strane, parametri URL-a omogućuju tražilicama fleksibilnost da brzo testiraju i utvrde kada određena vrijednost ne zahtijeva pristup indeksiranja svim opcijama.

    Uobičajene vrijednosti koje ne mijenjaju sadržaj stranice i moraju biti navedene kao URL parametri uključuju:

    • ID sesije
    • ID praćenje
    • ID-ovi preporuka
    • Vremenske oznake
    Primjer #3: Pretvaranje korisnički generiranih vrijednosti (moguće beskonačnih) u URL parametre koji se mogu indeksirati i indeksirati, ali su beskorisni za pretraživanje.
    Korištenje manjih podataka koje su generirali korisnici web-mjesta (kao što je zemljopisna dužina/širina ili "prije dana") u pretraženim i indeksiranim URL-ovima:
    • primjer.com/pronađi-liječnika? radius=15&latitude=40.7565068&longitude=-73.9668408
    • primjer.com/article?category=health& days-ago=7
    Kako da:
    • example.com/find-a-doctor?city=san-francisco&neighborhood=soma
    • example.com/articles?category=health&date=january-10-2014
    Umjesto da dopustite korisniku da generira vrijednosti za stvaranje URL-ova koji se mogu indeksirati (što rezultira beskrajnim mogućnostima s vrlo malom vrijednošću za posjetitelje), bolje je objaviti kategoriju stranice za najpopularnije vrijednosti, osim toga možete uključiti Dodatne informacije tako da stranica pruža veću vrijednost od uobičajene stranice s rezultatima pretraživanja. Alternativno, možete razmisliti o postavljanju korisnički generiranih vrijednosti u zasebni direktorij, a zatim korištenju robots.txt da biste spriječili indeksiranje iz tog direktorija.
    • example.com/filtering/ find-a-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
    • example.com/filtering/ articles?category=health&days-ago=7
    I u robots.txt:
    Korisnički agent: *
    Zabrani: /filtriranje/

    Primjer br. 4. Dodavanje URL parametara bez logike.

    • primjer.com/gumene-bombone/lizalice/gumene-bombone/gumene-bombone/proizvod?švedska-riba
    • example.com/product?cat=gumasti-bomboni&cat=lizalice&cat=gumasti-bomboni &cat=gumasti-bomboni&item=swedish-fish
    Dobra odluka:
    • primjer.com /gumeni-bomboni/ proizvod?item=švedska-riba
    Najbolja odluka:
    • example.com/product?item=swedish-fish&category=gummy-candy
    Vanjski parametri URL-a samo povećavaju dupliciranje, uzrokujući neučinkovito pretraživanje i indeksiranje stranice. Stoga je potrebno riješiti se nepotrebnih URL parametara i povremeno očistiti junk linkove prije generiranja novih URL-ova. Ako je za korisničku sesiju potrebno mnogo parametara, možete sakriti informacije u kolačićima umjesto stalnog dodavanja vrijednosti poput cat=gummy-candy&cat=lollipops&cat=gummy-candy&...

    Primjer #5: Predloži daljnje preciziranje (filtriranje) kada postoje nulti rezultati.

    Loše:
    Omogućuje korisnicima da odaberu filtre kada postoje nulte stavke za pročišćavanje.


    Pojašnjenje stranice s nula rezultata (na primjer, cijena=preko-10), što frustrira korisnike i uzrokuje nepotrebne zahtjeve za tražilice.

    Kako da:
    Kreirajte veze samo kada postoje elementi koje korisnik može odabrati. Ako je rezultat nula, veza je označena kao "siva" (tj. ne može se kliknuti). Da biste dodatno poboljšali upotrebljivost, razmislite o uključivanju pokazatelja broja dostupnih stavki pored svakog filtra.


    Prikazivanje stranice s nula rezultata (na primjer, cijena=preko-10) nije dopušteno, a korisnicima je zabranjeno nepotrebno klikanje, a tražilicama je zabranjeno indeksirati ovu nekorisnu stranicu.

    Potrebno je spriječiti pojavu nepotrebne adrese i smanjite prostor za posjetitelje stvaranjem URL-ova samo kada su proizvodi dostupni. To će pomoći da korisnici ostanu angažirani na vašoj web-lokaciji (manje klikova na gumb za povratak kada nisu pronađeni proizvodi) i smanjit će broj mogućih URL-ova poznatih tražilicama. Osim toga, ako stranica nije samo "trenutno rasprodana", nego je malo vjerojatno da će ikada sadržavati relevantne informacije, razmislite o tome da joj date kod odgovora 404. Na svojoj stranici 404 možete dizajnirati korisnu poruku za korisnike s više opcija u navigaciji ili okvir za pretraživanje kako bi korisnici mogli pronaći srodne proizvode.

    Za nove web stranice čiji webmasteri razmatraju implementaciju fasetirane navigacije, postoji nekoliko opcija za optimiziranje indeksiranja (skup adresa na vašoj web lokaciji poznatih Googleu) jedinstvenih stranica sa sadržajem i smanjenje dupliciranih stranica od ulaska u indeks tražilice (konsolidacija indeksiranja signali).

    Odredite koji su parametri URL-a potrebni tražilicama za indeksiranje svake pojedine stranice sa sadržajem (to jest, odredite koji su parametri potrebni za stvaranje barem jedne putanje klika do svake stavke). Traženi parametri mogu uključivati ​​item-id, category-id, page itd.

    Odredite koji će parametri biti korisni posjetiteljima s njihovim upitima, a koji će vjerojatno uzrokovati dupliciranje u indeksiranju i indeksiranju. U primjeru slatkiša (marmelada), URL parametar "taste" mogao bi biti vrijedan za korisnike s upitima u primjeru taste=sour. Međutim, logično je uzeti u obzir da parametar "cijena" uzrokuje nepotrebno dupliciranje category=gummy-candies&taste=sour&price=over-10 . Ostali uobičajeni primjeri:

    • Vrijedni parametri za tražilice: item-id, category-id, name, brand...
    • Nepotrebni parametri: session-id, price-range ...
    Pogledajmo implementaciju jedne od nekoliko opcija konfiguracije za URL-ove koji sadrže nepotrebne parametre. Samo se uvjerite da "nepotrebni" parametri URL-a zapravo nisu potrebni za indeksiranje tražilice ili da korisnik pronađe svaki pojedinačni proizvod!

    Opcija 1: i interne veze

    Označite sve nepotrebne URL-ove s . To će smanjiti troškove rada robota za pretraživanje i spriječiti smanjenje učestalosti indeksiranja. Morate globalno upravljati skeniranjem putem robots.txt (napomena prevoditelja: pogledajte članak " ").
    Upotrijebite atribut rel="canonical" za odvajanje stranica za indeks pretraživanja od stranica koje tamo nisu potrebne (na primjer, na stranici price=5-10 možete dodati atribut rel="canonical", označavajući kategoriju svih primjer kisele marmelade.com/category php?category=gummy-candies&taste=sour& page=all ).

    Opcija 2: Robots.txt i Disallow

    URL-ovi s nepotrebnim parametrima uključeni su u /filtering/ direktorij, koji će biti zatvoren u robots.txt (disallow). Ovo će svim tražilicama omogućiti indeksiranje samo "ispravne" unutarnje veze (sadržaja) stranice, ali će blokirati indeksiranje neželjenih URL-ova odjednom. Na primjer (example.com/category.php?category=gummy-candies), ako su vrijedni parametri bili stavka, kategorija i okus, a ID sesije i cijena nepotrebni, tada bi URL za okus bio ovakav:
    example.com/category.php?category=gummy-candies&taste=sour , ali svi nepotrebni parametri, poput cijene, bit će uključeni u URL u unaprijed definiranom direktoriju - /filtriranje/:
    example.com/filtering/category.php?category=gumasti-bomboni&price=5-10 ,
    koji će tada biti zabranjen putem robots.txt:
    Korisnički agent: *
    Zabrani: /filtriranje/

    Opcija 3: Odvojeni hostovi

    Uvjerite se da najbolja rješenja, navedene gore (na primjer, za nepotrebne adrese) i dalje vrijede. Inače, tražilice su već formirale veliku masu poveznica u indeksu. Stoga će vaš rad biti usmjeren na smanjenje daljnjeg rasta nepotrebnih stranica koje indeksira Googlebot i konsolidaciju signala indeksiranja.

    Koristite parametre sa standardnim kodiranjem i formatom ključ=vrijednost.

    Provjerite jesu li vrijednosti koje ne mijenjaju sadržaj stranice, kao što su ID-ovi sesije, implementirane kao ključ=vrijednost, a ne kao direktoriji.

    Nemojte dopustiti klikove ili generirati URL-ove kada nema elemenata za filtriranje.

    Dodajte logiku preslikavanju parametara URL-a: uklonite nepotrebne parametre umjesto stalnog dodavanja vrijednosti (npr. izbjegavajte generiranje veza kao što je ovo: example.com/product?cat=gummy-candy&cat=lollipops &cat=gummy-candy&item=swedish-fish ).

    Držite vrijedne parametre u URL-u tako da ih navedete prve (budući da su URL-ovi vidljivi u rezultatima pretraživanja), a manje relevantne parametre na kraju (na primjer, ID sesije).
    Izbjegavajte ovu strukturu veze: example.com/category.php?session-id=123&tracking-id=456 &category=gummy-candies&taste=sour
    Konfigurirajte parametre URL-a u Alatima za webmastere ako jasno razumijete kako veze funkcioniraju na vašoj web-lokaciji.

    Uvjerite se da kada koristeći JavaScript za dinamičko upravljanje sadržajem (sortiranje/filtriranje/sakrij) bez ažuriranja URL-a, postoje stvarne web-adrese na vašem web-mjestu koje imaju vrijednost pretraživanja, kao što su glavne kategorije i stranice proizvoda, koje je moguće indeksirati i indeksirati. Pokušajte ne koristiti samo početna stranica(tj. jedan URL) za cijelu vašu web-lokaciju i korištenje JavaScripta za dinamičku promjenu sadržaja s navigacijom - to će, nažalost, korisnicima dati samo jedan URL u pretraživanjima. Također provjerite nema li učinka na dinamičko filtriranje najgora strana, jer će spriječiti korisnika da radi s web mjestom.

    Poboljšajte indeksiranje razne stranice jedan sadržaj navođenjem atributa rel="canonical" privilegiranoj verziji stranice. Atribut rel="canonical" može se koristiti unutar jedne ili više domena.

    Optimizirajte indeksiranje sadržaja paginiranog (na primjer, page=1 i page=2 iz kategorije "gumenih bombona") na jedan od sljedećih načina:

    • Dodajte atribut rel="canonical" nizu stranica koje označavaju kanoničku kategoriju s parametrom "view-all" (na primjer, page=1, page=2 i page=3 iz kategorije "gumeni bomboni" s rel=”canonical” on category=gummy-candies&page=all ), pazeći da je stranica relevantna za korisnike i da se brzo učitava.
    • Upotrijebite označavanje stranica rel="next" i rel="prev" kako biste označili odnos između pojedinačnih stranica (pogledajte članak "Stranica s rel="next" i rel="prev" ").
    Uključite samo kanonske veze u svoje karte web-lokacija.

    reci prijateljima
    Pročitajte također