PINQ - Kyselyt tietojoukot. Faceted Search

Sisäänrakennettu fasetoitu haku Sisäänrakennettu tuotteeseen

Verkkokauppaan sisäänrakennettu fasettihaku - sisäinen haku - toimii monessa suhteessa nopeasti eikä kuormita järjestelmää.

  • Sisäänrakennettu tuotteeseen
  • Erittäin nopea
  • Ei lataa sivustoa
  • On infoblocks API:n tärkein osa
  • Ei vaadi verkkosivujen uudelleensuunnittelua
  • Indeksoitu automaattisesti uudelleen
Miksi niin nopeasti?

Asiakkaalle esitetään välittömästi valmiiksi valmistetut hakutulokset - mille tahansa parametriyhdistelmälle - faset. Järjestelmä laskee tuotteelle fasetit etukäteen - kaikki mahdolliset näiden ominaisuuksien leikkauspisteet suodattimessa. Nämä valmiit hakusarjat jaetaan sitten asiakkaille.

Miksi sivusto ei lataudu?

Tällä hetkellä, kun tulos annetaan asiakkaalle, laskelmia ei tehdä, koska tulos on jo valmis. Uuden tuotteen fasetti luodaan heti, kun se lisätään myyntiluetteloon. Haku indeksoidaan automaattisesti uudelleen uusien tuotteiden ja uusien ominaisuuksien perusteella.

Edut asiakkaille

Fasetoidun haun edut Asiakkaasi löytää tuotteen erittäin nopeasti leikkiessään helposti suodatinasetuksilla. Asiakas ei odota ja saa tulokset heti. Hakunopeus ei riipu luettelossa olevien nimikkeiden määrästä.


Älykäs suodatin 2.0

Asiakas löytää tuotteen nopeasti

Asiakkaasi löytää tuotteen erittäin nopeasti rajaamalla hakukyselyä jatkuvasti. Ja joka vaiheessa hän saa välittömästi tulokset - tuoteluettelon pyynnöstä. Hänen ei tarvitse odottaa pyyntönsä käsittelyä. Koska järjestelmä on laskenut kaikki mahdolliset vaihtoehdot etukäteen ja antaa yksinkertaisesti tyhjät tiedot. Pikkuhiljaa verkkokauppa näyttää tuloksena yhä vähemmän tuotteita. Nämä tuotteet ovat yhä lähempänä ostajan toiveita.

Interaktiivisuus ja moniulotteisuus

Tuotteen valinta ostajalle on kuin peliä. Asiakas vetää parametreja (hinta, paino), vaihtaa ominaisuuksia (väri, koko), asettaa lisäehtoja (brändi, materiaali, maku jne.) - ja järjestelmä järjestää tulokset välittömästi uudelleen. Tässä tapauksessa muokattavia parametreja voi olla niin monta kuin haluat - niiden määrä ei vaikuta tuloksen luomisen nopeuteen.

Mukavuus ja ystävällisyys

Fasetoidun navigoinnin avulla kokematonkin käyttäjä voi helposti valita tuotteen kaupasta. Hakutyökalujen manipulointi on erittäin kätevää. Lisäksi järjestelmä kysyy ostajalta kaikki parametrit, joilla hän voi valita tuotteen. Kauppa ikään kuin esittelee asiakkaalle tuotteen tärkeimmät ominaisuudet.

Asiakas ei odota pyynnön käsittelyä!
Esimerkiksi asiakkaasi ostaa kameran. Aluksi hän ilmoittaa vain 3 parametria älykkäässä suodattimessa: hinta, merkki, koko. Sen puoli sisältää 3 risteystä, hakutuloksia on paljon, mutta asiakas saa ne välittömästi. Asiakas asettaa painon - hän tarvitsee kevyen vempaimen. Järjestelmä antaa hänelle välittömästi, viipymättä pienemmän luettelon tavaroista. Asiakas asettaa näytön koon ja määrittää sitten tarvittavat toiminnot. Hänen edessään ovat halutut tavarat.


Hakunopeus

Hakunopeudella on väliä Hakunopeus vaikuttaa tehtyjen ostosten määrään

Mikään ei ärsytä asiakasta enemmän kuin vaikeuksia löytää tuotteita verkkosivustoltasi. Asiakas lähtee muihin liikkeisiin, jos hän etsii liian kauan. Vaikka kaupassasi olisi iso valinta tuotteita ja monia työkaluja niiden suodattamiseen. Asiakas ei välttämättä saa pyynnön tuloksia.


Opetusvideo: Miksi fasetoitu haku nopeuttaa älykästä suodatinta merkittävästi
"Fasetin" käyttö nopeuttaa hakua myymälässä suuruusluokkaa. Tässä tapauksessa nopeus ei riipu hakemiston elementtien määrästä.

Miksi haku on niin hidasta?
Tuotteen etsiminen liikkeestä voi kestää huomattavasti kauemmin kuin normaalit sivun latausajat. Varsinkin jos myymälässä on paljon tuotteita ja näiden tuotteiden ominaisuuksia. Hakulauseke monella tapaa se luo paljon tietokantakutsuja ja lataa sivustoa merkittävästi. Jos asiakkaita ja pyyntöjä on paljon, haku hidastuu huomattavasti.

Työn nopeus on vaikuttava! Tuotteen version 15.0 testitulokset kolmessa 500 tuhatta tuotetta sisältävien luetteloiden kategorioissa osoittivat, että verrattuna aikaisempiin versioihin:
  • Älykäs suodatinkomponentti – 15 kertaa nopeampi!
  • Katalogikomponentti – 5 kertaa nopeampi!
Hakutieto pysyy vakiona!
Nopea jopa ilman "fasettia"! Tuote pyrkii jatkuvasti nopeuttamaan itse luettelokomponentteja. "Sivuston nopeus" -palvelu näyttää nopeuden huomattavan lisääntyneen versiosta toiseen!

Jälleenrakennus

Indeksoinnin ja hakutulosten jatkuva rekonstruointi suoritetaan. Sisällön indeksointialgoritmia muokataan ja nopeutetaan. Hakutulosten esittämisen laatu paranee - erityisesti "kohina" vähenee. Kehittäjät aikovat näyttää henkilökohtaisia ​​tietoja nykyisestä asiakkaasta hakutuloksissa.

Kehittäjille: API Transparency


Edellinen näkymä

"Facet" on läpinäkyvä API:lle Tuotteeseen rakennettu "puoli" on läpinäkyvä API:lle. Se on tietolohkojen API:n pääosa. Siksi sen käyttö ei vaadi kehittäjiltä lisäponnistuksia. Sivustoja ei myöskään tarvitse suunnitella uudelleen.
  • CIBlockElement::GetList-menetelmän nopeuttaminen
  • Täysi integrointi älykkäällä suodattimella
GetList toimii nyt nopeammin, koska se yhdistää automaattisesti "puolen" toimintoon. D7:ssä on myös erillinen API.

Täysi integrointi älykkäällä suodattimella

Nyt kun teet asetuksia hallintaosassa, tuotteen ominaisuuksille ei voi ilmoittaa vain aktiivisuutta - osallistutaanko älysuodattimeen vai ei. Välittämällä ominaisuuden älykkäälle suodattimelle voit valita heti, kuinka ne näytetään. Missä muodossa omaisuus tulee näyttää asiakkaille: painikkeet, koot, liukusäätimet, pudotuslistat, luettelot värivalinnalla jne.



Näytä ominaisuus älykkäässä suodattimessa

Voidaan räätälöidä!

Älykäs suodatin näyttää nyt kauniimmalta. Kehittäjät voivat helposti muokata ja muokata sen ulkonäköä.

Tarkastelimme nopeasti PINQ:n asennusta ja perussyntaksia, LINQ-porttia PHP:hen. Tässä artikkelissa tarkastellaan, kuinka voit käyttää PINQ:ta MySQL:n fasetoidun hakuominaisuuden simulointiin.

Tässä artikkelissa emme kata kaikkia fasetoidun haun näkökohtia. Kiinnostuneet voivat etsiä sopivaa tietoa Internetistä.

Tyypillinen fasetoitu haku toimii näin:

  • Käyttäjä syöttää hakusanan tai useita avainsanoja. Esimerkiksi "reititin" etsiäksesi tuotteita, joiden kuvauksessa on sana "reititin", avainsanoissa, luokan nimessä, tunnisteissa jne.
  • Sivusto palauttaa luettelon tuotteista, jotka vastaavat näitä kriteerejä.
  • Sivustolla on useita linkkejä hakutermien mukauttamiseen. Sen avulla voit esimerkiksi määrittää tietyt reitittimen valmistajat tai asettaa hintaluokan tai muita ominaisuuksia.
  • Käyttäjä voi jatkaa lisähakuehtojen määrittämistä saadakseen kiinnostavan tietojoukon.

Faceted-haku on melko suosittu ja tehokas työkalu, joka näkyy melkein kaikilla verkkokauppasivustoilla.

Valitettavasti fasetoitu haku ei ole sisäänrakennettu MySQL:ään. Mitä meidän pitäisi tehdä, jos käytämme edelleen MySQL:ää, mutta haluamme antaa käyttäjälle tämän mahdollisuuden?

PINQ:lla, jolla on samanlainen, tehokas ja yksinkertainen lähestymistapa, voimme saavuttaa saman käyttäytymisen kuin käyttäisimme muita tietokantamoottoreita.

Laajenna demoa ensimmäisestä osasta

Huomautus: kaikki tämän osan ja ensimmäisen osan koodit löytyvät arkistosta.

Tässä artikkelissa laajennamme osan 1 demoa parantamalla merkittävästi fasettihakua.

Aloitetaan indeksillä.php ja lisätään siihen seuraavat rivit:

$app->get("demo2", funktio () use ($app) ( globaali $demo; $test2 = new pinqDemo\Demo($app); return $test2->test2($app, $demo->test1 ($app)); )); $app->get("demo2/facet/(avain)/(arvo)", funktio ($avain, $arvo) käyttö ($app) ( globaali $demo; $test3 = uusi pinqDemo\Demo($app); return $test3->test3($app, $demo->test1($app), $key, $value); ));

Ensimmäinen reitti vie meidät sivulle, josta näet kaikki hakua vastaavat merkinnät avainsana. Jotta esimerkki olisi yksinkertainen, valitsemme kaikki kirjat book_book -taulukosta. Se näyttää myös tuloksena olevan tietojoukon ja joukon linkkejä hakuehtojen määrittämiseksi.

Oikeissa sovelluksissa tällaisten linkkien napsautuksen jälkeen kaikki fasettisuodattimet mukautuvat tuloksena olevan tietojoukon raja-arvoihin. Käyttäjä voi siis lisätä uusia hakuehtoja peräkkäin, esimerkiksi valita ensin valmistaja, sitten määrittää hintaluokan jne.

Mutta tässä esimerkissä emme toteuta tätä toimintaa - kaikki suodattimet heijastavat alkuperäisen tietojoukon raja-arvoja. Tämä on ensimmäinen rajoitus ja ensimmäinen ehdokas parannusta esittelyssämme.

Kuten yllä olevasta koodista näet, todelliset toiminnot sijaitsevat toisessa tiedostossa nimeltä pinqDemo.php. Katsotaanpa vastaavaa koodia, joka tarjoaa fasetoidun hakuominaisuuden.

Aspektiluokka

Ensimmäinen askel on luoda luokka, joka edustaa aspektia. Yleensä näkökulman tulee sisältää useita ominaisuuksia:

  • Tiedot, joilla se toimii ($data)
  • Avain, jolla ryhmittely suoritetaan ($key)
  • Avaimen tyyppi ($type). Voi olla jokin seuraavista:
    • määritä koko merkkijono tarkkaa vastaavuutta varten
    • osoittavat osan merkkijonosta (yleensä ensimmäinen merkkijono), jos haluat etsiä kuvion mukaan
    • osoittavat arvoalueen ryhmittelyä varten
  • jos avaintyyppi on arvoalue, sinun on määritettävä arvoaskel alueen ala- ja ylärajan määrittämiseksi; tai jos tyyppi on osa merkkijonoa, sinun on määritettävä kuinka monta ensimmäistä kirjainta käytetään ryhmittelyyn ($range)

Ryhmittely on näkökohdan kriittisin osa. Kaikki kootut tiedot, jotka näkökohta voi pystyä palauttamaan, riippuvat ryhmittelykriteereistä. Tavallisesti eniten käytetyt hakukriteerit ovat "Täysi merkkijono", "Osa merkkijonosta" tai "Arvoalue".

Nimiavaruus classFacet (käytä Pinq\ITraversable, Pinq\Traversable; class Facet ( julkinen $data; // Alkuperäinen tietojoukko julkinen $avain; // kenttä, jonka mukaan julkinen $tyyppi ryhmitellään; // F: koko rivi; S: alkumerkkijonot ; R: alue; julkinen $alue; // sillä on rooli vain jos $tyyppi != F ... julkinen funktio getFacet() ( $filter = ""; if ($this->type == "F") / / koko rivi ( ... ) elseif ($this->type == "S") // rivin alku ( ... ) elseif ($this->type == "R") // arvoalue ​​( $ suodatin = $this->data ->groupBy(funktio($rivi) (paluu kerros($rivi[$this->key] / $this->range) * $this->range; )) -> select(funktio (ITraversable $data) ( return ["avain" => $data->viimeinen()[$this->avain], "count" => $data->count()]; )); ) return $suodatin; ) ) )

Tämän luokan päätehtävä on palauttaa suodatettu tietojoukko alkuperäisen tietojoukon ja kuvasuhteen ominaisuuksien perusteella. Koodista käy selvästi ilmi, että he käyttävät erityyppisille tileille eri tavoilla tietojen ryhmittelyä. Yllä olevassa koodissa osoitimme, miltä koodi voisi näyttää, jos ryhmittelemme tiedot arvoalueen mukaan, joka on määritetty $alue .

Näkökohtien asettaminen ja lähdetietojen näyttäminen

Julkinen funktio testi2($app, $data) ( $facet = $this->getFacet($data); return $app["twig"]->render("demo2.html.twig", array("facet" = > $facet, "data" => $data)); ) yksityinen funktio getFacet($alkuperäiset tiedot) ( $facet = array(); $data = \Pinq\Traversable::from($originalData); // 3 luontiesimerkkiä eri aspektiobjekteja ja palauttaa aspektit $filter1 = new \classFacet\Facet($data, "author", "F"); $filter2 = new \classFacet\Facet($data, "otsikko", "S", 6 ) ; $suodatin3 = uusi \classFacet\Facet($data, "hinta", "R", 10); $facet[$filter1->key] = $suodatin1->getFacet(); $facet[$filter2-> avain ] = $filter2->getFacet(); $facet[$filter3->key] = $suodatin3->getFacet(); palauttaa $facet; )

GetFacet()-menetelmässä teemme seuraavaa:

  • Muunna alkuperäiset tiedot Pinq\Traversable-objektiksi jatkokäsittelyä varten
  • Luomme kolme aspektia. 'Tekijä'-aspekti ryhmittelee tekijäkentän mukaan ja toteuttaa ryhmittelyn koko rivin mukaan; Aspect 'otsikko' - otsikkokentän mukaan ja ryhmittely rivin osan mukaan (ensimmäisten 6 merkin mukaan); aspekti "hinta" - hintakentän mukaan ryhmittelyllä alueen mukaan (10:n välein)
  • Lopuksi poimimme aspektit ja palautamme ne test2-funktioon, jotta ne voidaan tulostaa malliin näyttöä varten
Tulostusnäkökohdat ja suodatettu data

Useimmissa tapauksissa suodattimet näytetään rivinä, ja ne ohjaavat sinut tarkastelemaan suodatettua tulosta.

Olemme jo luoneet reitin ("demo2/facet/(avain)/(arvo)") fasetoitujen hakutulosten näyttämiseen ja linkkien suodattamiseen.

Reitillä on kaksi parametria suodatettavan avaimen ja avaimen arvon mukaan. Test3-funktio, joka on sidottu tähän reittiin, on esitetty alla:

Julkinen funktio testi3($sovellus, $alkuperäiset tiedot, $avain, $arvo) ($data = \Pinq\Traversable::from($alkuperäiset tiedot); $facet = $this->getFacet($data); $suodatin = null; if ($avain == "author") ( $suodatin = $data ->where(funktio($rivi) use ($arvo) (Return $row["author"] == $arvo; )) ->orderByAscending( function($row) use ($key) ( return $row["hinta"]; )) ; ) elseif ($key == "hinta") ( ... ) else //$key== title ( .. . ) return $app["oksa"]->render("demo2.html.twig", array("facet" => $facet, "data" => $suodatin)); )

Pohjimmiltaan, avaimesta riippuen, käytämme suodatusta (anonyymi funktio where-lauseessa) välitetyn arvon mukaan ja saamme seuraavan joukon suodatettuja tietoja. Voimme myös asettaa tietojen suodatusjärjestyksen.

Lopuksi näytämme raakatiedot (suodattimien kanssa) mallissa. Tämä reitti käyttää samaa mallia, jota käytimme "demo2:ssa".

Hakupalkki

    (% k:lle, v fasetissa %)
  • ((k|isoilla kirjaimilla))
    • (% vv:lle v %)
    • ((vv.count))((vv.key))
    • (%endfor %)
    (%endfor %)

Meidän on muistettava, että sovelluksemme luomat aspektit ovat sisäkkäisiä taulukoita. Ensimmäisellä tasolla tämä on joukko kaikkia näkökohtia, ja meidän tapauksessamme niitä on kolme (vastaavasti tekijälle, nimelle, hinnalle).

Jokaisella aspektilla on avainarvotaulukko, joten voimme iteroida sen yli tavallisilla menetelmillä.

Huomaa, kuinka rakennamme URL-osoitteet linkeillemme. Käytämme reitin parametreina sekä ulkoisen silmukan avainta (k) että sisäsilmukan avaimia (vv.key) ("demo2/facet/(avain)/(arvo)"). Matriisikokoa (vv.count) käytetään mallissa näyttämiseen.

Ensimmäinen kuva näyttää alkuperäisen tietojoukon, ja toinen kuva on suodatettu hintaluokan 0–10 dollarin mukaan ja lajiteltu tekijän mukaan.

Hienoa, pystyimme simuloimaan fasetoitua hakua sovelluksessamme!

Ennen kuin lopetamme tämän artikkelin, meidän on tarkasteltava esimerkkiämme ja määritettävä, mitä voidaan parantaa ja mitä rajoituksia meillä on.

Mahdollisia parannuksia

Yleisesti ottaen tämä on hyvin perusesimerkki. Olemme juuri käyneet läpi perussyntaksin ja käsitteet ja toteuttaneet ne toimivana esimerkkinä. Kuten aiemmin todettiin, meillä on useita alueita, joita voitaisiin parantaa joustavuuden lisäämiseksi.

Meidän on otettava käyttöön "peittokuva"-hakuehdot, koska nykyinen esimerkki rajoittaa meidät mahdollisuuteen käyttää hakusuodatusta vain alkuperäiseen tietojoukkoon; emme voi soveltaa fasetoitua hakua jo suodatettuun tulokseen. Tämä on suurin parannus, jonka voin kuvitella.

Rajoitukset

Tässä artikkelissa toteutetulla fasettihaulla on vakavia rajoituksia (jotka voivat koskea myös muita fasettihaun toteutuksia):

Haemme tietoja MySQL:stä joka kerta

Tämä sovellus käyttää Silex-kehystä. Kuten mikä tahansa yksittäinen aloituspistekehys, kuten Silex, Symfony, Laravel, sen index.php (tai app.php) tiedosto kutsutaan aina, kun reitti jäsennetään ja ohjaintoimintoja suoritetaan.

Jos katsot koodia index.php-tiedostossamme, huomaat, että seuraava koodirivi:

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

kutsutaan aina, kun sovellussivu hahmonnetaan, mikä tarkoittaa, että seuraavat koodirivit suoritetaan joka kerta:

Luokan esittely ( yksityinen $books = ""; julkinen funktio __construct($app) ( $sql = "valitse * book_book-tilauksesta tunnuksen mukaan"; $this->books = $app["db"]->fetchAll($sql ;)

Onko parempi, jos emme käytä kehystä? No, huolimatta siitä, että sovellusten kehittäminen ilman kehyksiä ei ole hyvä idea, voin sanoa, että kohtaamme samoja ongelmia: dataa (ja tilaa) ei tallenneta eri välillä. HTTP-pyynnöt. Tämä on HTTP:n perusominaisuus. Tämä voidaan välttää käyttämällä välimuistimekanismeja.

Tallensimme useita SQL-kyselyitä aspektien avulla. Sen sijaan, että olisimme läpäisseet yhden valintakyselyn tietojen hakemiseksi, ja kolme ryhmäkohtaista kyselyä vastaavien jos-lauseiden kanssa, suoritimme vain yhden kyselyn ja käytimme PINQ:ta koottujen tietojen saamiseksi.

Johtopäätös

Tässä osassa otimme käyttöön mahdollisuuden fasettihakuun kirjakokoelmasta. Kuten sanoin, tämä on vain pieni esimerkki, jossa on parantamisen varaa ja jolla on useita rajoituksia.

( "kysely": ( "ja": [ ( "termit": ("maa": ["ole", "fr"]) ), ( "terms": ("luokka": ["kirjat", "elokuvat" " "]) ) ] ) )

Laskureissa voimme käyttää Elasticsearchin sisäänrakennettuja aggregaatteja. Kumpikin kahdesta aspektista on tallennettu yhtenä kenttänä indeksiin, joten voimme käyttää termien yhdistämistä kussakin näistä kentistä. Yhdistelmä palauttaa laskurin tämän kentän arvolle.

( "kysely": ( "ja": [ ( "termit": ("maa": ["ole", "fr"]) ), ( "terms": ("luokka": ["kirjat", "elokuvat" " "]) ) ]), "aggregaatiot": ( "maat": ( "termit": ("kenttä": "maa")), "luokat": ( "terms": ("kenttä": "luokka" ) ) ) )

Jos suoritat tämän kyselyn, huomaat, että laskurit on poistettu käytöstä. Kahden valitsemattoman maan, Portugalin ja Brasilian, laskuri on 0. Vaikka on olemassa todellisia tuloksia, jos haluamme valita ne (ORsisemmän reunan vuoksi). Tämä tapahtuu, koska oletusarvoisesti Elasticsearch suorittaa aggregoinnit tulosjoukolle. Tämä tarkoittaa, että jos valitset Ranskan, toisen maan suodattimien pistemäärä on 0, koska tulosjoukko sisältää vain Ranskasta peräisin olevia kohteita.

Korjataksemme tämän, meidän on kehotettava Elasticsearchia suorittamaan aggregointi koko tietojoukolle jättäen kyselyn huomiotta. Voimme tehdä tämän määrittelemällä klusterimme maailmanlaajuisiksi.

( "kysely": ( "ja": [ ( "termit": ("maa": ["ole", "fr"]) ), ( "terms": ("luokka": ["kirjat", "elokuvat" " "]) ) ]), "aggregations": ( "all_products": ( "global": (), "aggregations": ( "countries": ( "terms": ("kenttä": "maa")), " luokat": ( "termit": ("kenttä": "luokka") ) ) ) )

Jos vain tekisimme tämän, laskurimme olisivat aina samat, koska ne laskevat aina koko tietojoukon suodattimistamme riippumatta. Yksiköistämme on tehtävä hieman monimutkaisempia, jotta tämä toimisi, meidän on lisättävä niihin suodattimia. Jokaisen koosteen on perustuttava tietojoukkoon, jossa on käytössä kaikki suodattimet paitsi omansa. Näin ollen tilikohtainen koonti Ranskassa ottaa huomioon tietojoukon, jossa on käytetty luokkasuodatinta, mutta ei maasuodatinta:

( "kysely": ( "ja": [ ( "termit": ("maa": ["ole", "fr"]) ), ( "terms": ("luokka": ["kirjat", "elokuvat" " "]) ) ]), "aggregations": ( "all_products": ( "global": (), "aggregations": ( "countries": ( "filter": ( "and": [ ( "termit": ( "luokka": ["kirjat","elokuvat"]) ) ] ), "aggregations": ( "filtered_countries": ( "terms": ("kenttä": "maa") ) ) ), "luokat": ( "suodatin": ( "ja": [ ( "termit": ("maa": ["olla","fr"]) ]), "aggregations": ( "filtered_categories": ( "termit": ( "kenttä": "luokka") ) ) ) ) ) )

( "took": 153, "timed_out": false, "_shards": ( "yhteensä": 5, "onnistunut": 5, "epäonnistunut": 0), "osumat": ( "yhteensä": 3, "max_score ": 0, "osumat": ["..."]), "aggregations": ( "all_products": ( "doc_count": 21, "filtered kategoriat": ( "doc_count": 13, "categories": ( "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ ( "key": "elokuvat", "doc_count": 6 ), ( "key": "musiikki", "doc_count": 4 ), ( "key": "books", "doc_count": 3 ) ] ) ), "filtered_countries": ( "doc_count": 15, "countries": ( "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ ( "key": "fr", "doc_count": 6 ), ( "key": "br", "doc_count": 4 ), ( "key": "be", "doc_count": 3 ), ( "avain": "pt", "doc_count": 2 ) ] ) ) ) )

Yii2-kehys $terms = QueryHelper::terms("luokat.nimi" , "oma luokka" ) ; $nested = QueryHelper:: sisäkkäinen ("merkkijono_puoli" , QueryHelper:: suodatin ([ QueryHelper:: termi ("merkkijono_puole.facet_name" , [ "arvo" => $id , "boost" => 1 ]) , QueryHelper:: termi ("merkkijono_puol.faset_arvo" , ​​[ "arvo" => $arvo , "tehostus" => 1 ] ) , ] ) ) ; $suodatin = QueryHelper::should ($sisätetty) ;

Tämän päivän oppitunnilla yritämme luoda jäljitelmän fasetoidusta hausta Javascriptin avulla. Oletan, että tiedät jo, mitä fasetoitu haku on, jos luet tätä opetusohjelmaa. Muussa tapauksessa googleta sitä tai katso Amazonista tai esittelystäni.

Ensin tarvitsemme kirjaston github.com/eikes/facetedsearch. Lataa se ja liitä facetedsearch.js-tiedosto projektiimme. Tarvitsemme myös jQuery- ja Underscore-kirjastot.

Disclaimer: Ymmärrän, että JQ ei ole enää kakku, mutta käytän sitä tuttuna syntaktisena sokerina, voit kirjoittaa sen uudelleen sinulle tutumpiin kirjastoihin tai vanilja JS: ksi.

Joten ensin tehdään yksinkertainen merkintä yhdistetyillä riippuvuuksilla:

Asiakirja // Tässä näytämme fasettisuodattimet // Ja tässä elementtimme ovat

Nyt meidän on kuvattava sovelluksemme asetukset ja luotava malli taulukon elementtien näyttämiseksi, jotka lajittelemme fasettien avulla:

$(function())( var item_template = // Kuvaile mallia "" + " " class="img-responsive">" + ", " + "

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

" + "

" + ""; settings = ( items: example_items, facets: ( // Määritä aspektiluokat "category" : "Mikä luokka", "manner" : "Mikä maanosa", "kieli" : "Ohjelmointikieli"), tulosValitsija: "#results", // DOM-elementti, jossa näytämme tulokset facetSelector: "#facets", // DOM-elementti faseteille resultTemplate: item_template, paginationCount: 8, // Elementtien lukumäärä sivua kohden orderByOptions: ("etunimi": " Etunimi ", "sukunimi": "Sukunimi", "luokka": "Luokka", "RANDOM": "Satunnainen"), facetSortOption: ("manner": ["Pohjois-Amerikka", "Etelä-Amerikka"]) ) $. facetelize(asetukset); ));

No, itse asiassa luo itse JSON-taulukko elementeillä, jotka näytetään fasetoidussa JS-haussamme:

Var items = [ ( "etunimi": "Maria", "sukunimi": "Smith", "imageURL": "http://lorempixel.com/150/150/cats/2", "description": "Sed Ea Amet. Stet Voluptua. Nonumy Magna Takimata ", "luokka": "Hiiri", "kieli": ["Smalltalk", "XSLT"], "manner": "Afrikka"), ( "etunimi": "Patricia" ", "sukunimi": "Johnson", "imageURL": "http://lorempixel.com/150/150/cats/3", "description": "Ut Takimata Sit Aliquyam Labore Aliquyam Sit Sit Lorem Amet. Ipsum Rebum ." , "luokka": "Leijona", "manner": "Pohjois-Amerikka", ... ];

Laittaisin tämän taulukon erilliseen JS-tiedostoon, joka luodaan dynaamisesti, esimerkiksi tietokannasta.

Siinä kaikki, saamme fasetoidun haun JavaScriptissä ja voimme muokata sitä. Seuraavaksi toimitan kirjaston käännetyn dokumentaation, josta näet tarvitsemasi laukaisimeen.

Dokumentaation ominaisuudet

Kaksi funktiota viedään jQuery-nimiavaruuteen.

facetelize Käytetään fasetoidun haun alustamiseen annetuilla asetuksilla.

facetUpdate Voidaan käyttää, jos haluat muuttaa fasetin haun tilaa ulkoisesti.

Objektin asetukset

kohteet: Joukko kohteita, jotka suodatetaan ja lajitellaan prosessin aikana.

Fasetit: Objekti, jonka avaimet vastaavat elementin avaimia ja arvoja, on kyseisen fasetin otsikko. Kohteet suodatetaan sen mukaan, mikä arvo niillä on näille avaimille.

orderByOptions: Samanlainen kuin fasetit, paitsi että näitä avainarvo-pareja käytetään vain lajitteluun. Kun RANDOM-näppäin on käytössä, tulokset voidaan satunnaistaa.

facetSelector: Tämä on valitsin, jota käytetään etsimään DOM-solmu, josta fasettisuodattimet valitaan.

resultSelector: Tämä on valitsin, jota käytetään etsimään DOM-solmu, jossa tulokset näytetään.

resultTemplate: Merkkijono, jota Alaviiva-mallimoottori käyttää hahmontamaan kunkin elementtitaulukon elementit. Seuraavat attribuutit lisätään jokaiseen elementtiin, joita voidaan käyttää myös mallissa: batchItemNr, batchItemCount ja totalItemCount.

tila: Tämä objekti tallentaa nykyiset suodattimet, lajittelee: currentResult ja muut. Voit antaa orderBy-merkkijonon tai suodatinobjektin niiden esiasettamiseksi.

enablePagination: Boolen arvo ottaa käyttöön sivutus ja "lataa lisää" -painike, oletuksena tosi .

paginationCount: Jos sivutustoiminto on käytössä, asettaa elementtien määrän sivua kohden, oletusarvo on 50.

facetSortOption: Tällä toiminnolla voit muuttaa fasettielementtien järjestystä. Ottaa objektin, jonka avaimet vastaavat fasettien nimiä ja arvoja, joukoksi fasettiarvoja, jotka voidaan järjestää haluamaasi järjestykseen. Tämä esimerkki lajittelee maanosat eri järjestykseen ja lisää kohteet, jotka eivät sisälly matriisiin, aakkosjärjestyksessä:

FacetSortOption: ("manner": ["Pohjois-Amerikka", "Etelä-Amerikka"])

Malleja on muitakin, ole hyvä ja katso lähde facetedsearch.js nähdäksesi kaikki käytettävissä olevat mallivaihtoehdot.

Tapahtumat

Voit sitoutua joihinkin tapahtumiin, joiden pitäisi lähettää ilmoituksia, kun joitain toimintoja tapahtui. Käytämme tähän jquery-tapahtumajärjestelmää:

facetuicreated: Voit sitoa tämän toiminnon settings.facetSelector DOM -elementtiin, josta tulee ilmoittaa, kun käyttöliittymä on luotu.

facetedsearchresultupdate: Voit sitoa tämän toiminnon settings.resultSelector DOM-elementtiin saadaksesi ilmoituksen päivityksen tuloksista.

facetedsearchfacetclick: Tämä tapahtuma käynnistyy, kun fasettia napsautetaan ja käynnistetään settings.facetSelector-elementissä. Joka vastaanottaa fasetin id:n argumenttina.

facetedsearchorderby: Tämä tapahtuma käynnistyy, kun lajitteluelementtiä napsautetaan settings.facetSelector-elementissä. Se ottaa ID-järjestyksen argumenttina.

$(settings.resultSelector).bind("facetedsearchresultupdate", function())( // tee jotain, ehkä ));

Nykyajan ihmiset yrittävät käyttää yhä vähemmän aikaa ostoksille. Hitaat tuoteluettelot ajavat asiakkaat pois, kauppa menettää asiakkaita ja osan voitoistaan. Tee verkkokaupastasi houkuttelevampi fasettiteknologialla Facet - ts. ennalta määritetty. Hae. Luo fasetoituja indeksejä ja nopeutta merkittävästi tuotteiden hakua ja koko luettelon työtä.

Huomautus: Fasetoitu hakumekanismi on saatavilla Information Blocks -moduulin versiosta 15.0.1 alkaen ja se on integroitu komponenttiin. Komponentti on visuaaliseen kuoreen suunniteltu ohjelmakoodi, joka suorittaa moduulin tietyn toiminnon tietojen näyttämiseksi julkisessa tilassa. osa. Voimme lisätä tämän koodilohkon verkkosivuston sivuille kirjoittamatta mitään koodia suoraan. Älykäs suodatin Komponentti valmistelee suodattimen tietolohkosta valintaa varten ja näyttää suodatinlomakkeen elementtien suodatusta varten. Komponentti on kytkettävä ennen komponenttia luetteloelementtien näyttämistä varten, muuten elementtiluetteloa ei suodateta. Komponentti on vakio, sisältyy moduulijakeluun ja sisältää kolme mallia: .default , visual_horizontal ja visual_vertical . (Kahta viimeistä mallia ei tueta, ne säilyvät yhteensopivuuden säilyttämiseksi.)

Visuaalisessa editorissa komponentti sijaitsee polun varrella Sisältö > Katalogi > Älykäs suodatin.

Komponentti kuuluu Information blocks -moduuliin.

Lisätietoja fasetoidusta hausta

Katsotaanpa esimerkkiä:

Menemme verkkokauppaan ja valitsemme suodattimesta, että tarvitsemme punaisen T-paidan:

  • Ilman fasetoitua hakua suodatin alkaisi iteroida läpi koko tuoteluettelon löytääkseen tuotteen "T-paita" väriominaisuuden "Punainen" kanssa, mikä veisi paljon aikaa, jos tuotteita olisi paljon.
  • Jos määrität fasetoidun haun, tietylle ominaisuuden arvolle luodaan valmiita tuotehakujoukkoja (fasetoidut indeksit), ts. vaihtoehtoja mahdollisiin pyyntöihin Esimerkiksi punainen T-paita, kaikki mustat puuvillatuotteet, XS-koon mekot jne. älykkäässä suodattimessa lasketaan etukäteen ja tulos näytetään välittömästi. Tämän tyyppinen tuotehaku on paljon nopeampaa.

Luodaan fasetoidut indeksit muutamassa yksinkertaisessa vaiheessa:

Onko fasettiindeksit luotava uudelleen?

Fasetoidut indeksit luodaan automaattisesti tai sinun on luotava ne uudelleen manuaalisesti suoritetuista toimista riippuen:

Automaattisesti Lisätty uusia tai muokattu olemassa olevia tuotteita.
älä luo uusia ominaisuuksia.
Manuaalisesti Järjestelmä pyytää sinua tästä käyttämällä viestiä sivujen yläosassa
hallinnollinen osa.
Lisätty uusia tai muokattuja osia luetteloon.
Kun lisäät uutta tai poistat omaisuutta älykkäästä suodattimesta.
Purkattaessa tavaroita esimerkiksi 1C:stä, jos tavara luo uusia ominaisuuksia.

Faceted haku parantaa tuoteluettelon suorituskykyä. Käyttääksesi sitä tarvitset:

  • Luo fasetoituja indeksejä tuoteluetteloon;
  • Katso ilmoituksia tarpeesta luoda indeksit manuaalisesti uudelleen.
  • Aiheeseen liittyviä julkaisuja