PINQ - Të dhënat e marra në pyetje. Kërkim i Facetuar

Kërkim i integruar me aspekte I integruar në produkt

Kërkimi i aspekteve i integruar në dyqanin online - kërkimi i brendshëm - funksionon shpejt në shumë aspekte dhe nuk e ngarkon sistemin.

  • E integruar në produkt
  • Shumë shpejt
  • Nuk e ngarkon faqen
  • Është pjesa kryesore e API-së së infoblocks
  • Nuk kërkon ridizajnim të faqes në internet
  • Riindeksohet automatikisht
Pse kaq shpejt?

Klientit i prezantohet menjëherë rezultatet e kërkimit të përgatitura paraprakisht - për çdo kombinim të parametrave - aspekt. Sistemi llogarit paraprakisht aspektet për një produkt - të gjitha kryqëzimet e mundshme të këtyre vetive në filtër. Këto grupe kërkimi të gatshme u lëshohen më pas klientëve.

Pse nuk ngarkohet faqja?

Në momentin që rezultati i lëshohet klientit, nuk bëhen llogaritje, sepse rezultati është tashmë gati. Një aspekt për një produkt të ri krijohet menjëherë kur shtohet në katalogun e shitjeve. Kërkimi ri-indeksohet automatikisht në bazë të produkteve të reja dhe pronave të reja.

Përfitimet për klientët

Përparësitë e kërkimit me aspekte Klienti juaj e gjen produktin shumë shpejt, duke luajtur lehtësisht me cilësimet e filtrit. Klienti nuk pret dhe merr rezultate në çast. Shpejtësia e kërkimit nuk varet nga numri i artikujve në katalog.


Filtri i zgjuar 2.0

Klienti e gjen shpejt produktin

Klienti juaj e gjen produktin shumë shpejt duke ngushtuar vazhdimisht pyetjen e kërkimit. Dhe në çdo hap, ai menjëherë merr rezultate - një listë produktesh sipas kërkesës. Ai nuk duhet të presë që kërkesa e tij të shqyrtohet. Sepse sistemi ka llogaritur gjithçka paraprakisht opsionet e mundshme, dhe thjesht lëshon boshllëqe. Gradualisht, dyqani online shfaq gjithnjë e më pak produkte si rezultat. Këto produkte po i afrohen gjithnjë e më shumë kërkesës së blerësit.

Interaktiviteti dhe shumëdimensionaliteti

Zgjedhja e një produkti për një blerës është si një lojë. Klienti zvarrit rrëshqitësit e parametrave (çmimi, pesha), ndërron vetitë (ngjyra, madhësia), vendos kushte shtesë(marka, materiali, shija, etj.) - dhe sistemi i rindërton menjëherë rezultatet. Në këtë rast, mund të ketë aq parametra të personalizueshëm sa ju pëlqen - numri i tyre nuk ndikon në shpejtësinë e gjenerimit të rezultatit.

Komoditet dhe miqësi

Me lundrimin me aspekte, edhe një përdorues i papërvojë mund të zgjedhë lehtësisht një produkt në dyqan. Manipulimi i mjeteve të kërkimit është shumë i përshtatshëm. Përveç kësaj, sistemi i kërkon blerësit të gjithë parametrat me të cilët ai mund të zgjedhë një produkt. Dyqani, si të thuash, i tregon klientit vetitë kryesore të produktit.

Klienti nuk pret që kërkesa të përpunohet!
Për shembull, klienti juaj blen një aparat fotografik. Fillimisht, ai tregon vetëm 3 parametra në filtrin inteligjent: çmimi, marka, madhësia. Aspekti i tij përfshin 3 kryqëzime, ka shumë rezultate kërkimi, por klienti i merr ato menjëherë. Klienti vendos peshën - ai ka nevojë për një vegël të lehtë. Sistemi menjëherë, pa vonesë, i jep atij një listë më të vogël të mallrave. Klienti cakton madhësinë e ekranit dhe më pas specifikon funksionalitetin e kërkuar. Përpara tij janë malli i dëshiruar.


Shpejtësia e kërkimit

Shpejtësia e kërkimit ka rëndësi Shpejtësia e kërkimit ndikon në numrin e blerjeve të kryera

Asgjë nuk e irriton një klient më shumë sesa vështirësia në gjetjen e produkteve në faqen tuaj të internetit. Klienti do të largohet për në dyqane të tjera nëse kërkon shumë gjatë. Edhe nëse dyqani juaj përmban zgjedhje e madhe produkte dhe shumë mjete për filtrimin e tyre. Klienti mund të mos marrë rezultate nga kërkesa.


Udhëzues video: Pse kërkimi me aspekte përshpejton ndjeshëm një filtër inteligjent
Përdorimi i "aspektit" përshpejton kërkimin brenda dyqanit me një renditje të madhësisë. Në këtë rast, shpejtësia nuk varet nga numri i elementeve në drejtori.

Pse kërkimi është kaq i ngadaltë?
Kërkimi i një produkti në një vitrinë mund të zgjasë shumë më shumë se koha normale e ngarkimit të faqes. Sidomos nëse ka një numër të madh të produkteve në dyqan dhe vetitë e këtyre produkteve. Pyetja e kërkimit në shumë mënyra krijon shumë thirrje të bazës së të dhënave dhe ngarkon ndjeshëm faqen. Nëse ka shumë klientë dhe kërkesa, kërkimi ngadalësohet ndjeshëm.

Shpejtësia e punës është mbresëlënëse! Rezultatet e testit për versionin 15.0 të produktit në tre kategori katalogësh që përmbajnë 500 mijë artikuj treguan se në krahasim me versionet e mëparshme:
  • Komponenti inteligjent i filtrit – 15 herë më i shpejtë!
  • Komponenti i katalogut - 5 herë më shpejt!
Inteligjenca e kërkimit mbetet konstante!
Shpejt edhe pa “aspekt”! Produkti po punon vazhdimisht për të përshpejtuar vetë komponentët e katalogut. Shërbimi "Site Speed" tregon një rritje të ndjeshme të shpejtësisë nga versioni në version!

Rindërtimi

Rindërtimi i vazhdueshëm i rezultateve të indeksimit dhe kërkimit kryhet. Algoritmi i indeksimit të përmbajtjes po ripunohet dhe përshpejtohet. Cilësia e paraqitjes së rezultateve të kërkimit është përmirësuar - në veçanti, "zhurma" zvogëlohet. Zhvilluesit planifikojnë të shfaqin të dhëna të personalizuara për klientin aktual në rezultatet e kërkimit.

Për Zhvilluesit: API Transparency


Pamje e mëparshme

"Facet" është transparent për API "Aspekti" i integruar në produkt është transparent për API. Është pjesa kryesore e API-së së infoblocks. Prandaj, përdorimi i tij nuk kërkon përpjekje shtesë për zhvilluesit. Gjithashtu nuk ka nevojë të ridizajnohen faqet.
  • Përshpejtimi i metodës CIBlockElement::GetList
  • Integrim i plotë me filtrin inteligjent
GetList tani funksionon më shpejt sepse lidh automatikisht një "aspekt" për të funksionuar. Ekziston gjithashtu një API e veçantë në D7.

Integrim i plotë me filtrin inteligjent

Tani, kur bëni cilësime në pjesën administrative, për vetitë e produktit nuk mund të tregoni vetëm aktivitetin - nëse do të merrni pjesë apo jo në filtrin inteligjent. Duke kaluar një pronë te Filtri i zgjuar, mund të zgjidhni menjëherë se si t'i shfaqni ato. Në çfarë forme duhet t'u tregohet klientëve prona: butona, madhësi, rrëshqitës, lista rënëse, lista me përzgjedhje ngjyrash, etj.



Shfaq pronën në Filtrin inteligjent

Mund të personalizohet!

Filtri inteligjent tani duket më i bukur. Zhvilluesit mund ta personalizojnë lehtësisht dhe të personalizojnë më tej pamjen e saj.

Ne hodhëm një vështrim të shpejtë në instalimin dhe sintaksën bazë të PINQ, një port i LINQ në PHP. Në këtë artikull, ne do të shikojmë se si të përdorim PINQ për të simuluar veçorinë e kërkimit të aspekteve në MySQL.

Në këtë artikull ne nuk do t'i mbulojmë të gjitha aspektet e kërkimit të aspekteve. Të interesuarit mund të kërkojnë informacion të përshtatshëm në internet.

Një kërkim tipik i aspekteve funksionon si kjo:

  • Përdoruesi fut një fjalë kyçe, ose disa fjalë kyçe, për të kërkuar. Për shembull, "router" për të kërkuar produkte në të cilat fjala "ruter" shfaqet në përshkrim, fjalë kyçe, emrin e kategorisë, etiketat, etj.
  • Faqja kthen një listë të produkteve që përputhen me këto kritere.
  • Faqja ofron disa lidhje për të personalizuar termat e kërkimit tuaj. Për shembull, mund t'ju lejojë të specifikoni prodhues specifikë të ruterit, ose të vendosni një gamë çmimesh ose veçori të tjera.
  • Përdoruesi mund të vazhdojë të specifikojë kriteret shtesë të kërkimit për të marrë grupin e të dhënave me interes.

Kërkimi i aspekteve është mjaft popullor dhe një mjet i fuqishëm që mund të shihet pothuajse në çdo faqe interneti të tregtisë elektronike.

Fatkeqësisht, kërkimi i aspekteve nuk është i integruar në MySQL. Pra, çfarë duhet të bëjmë nëse ende përdorim MySQL, por duam t'i japim përdoruesit këtë mundësi?

Me PINQ, i cili ka një qasje të ngjashme, të fuqishme dhe të thjeshtë, ne mund të arrijmë të njëjtën sjellje sikur të ishim duke përdorur motorë të tjerë të bazës së të dhënave.

Zgjerimi i demonstrimit nga pjesa e parë

Shënim: i gjithë kodi nga kjo pjesë, dhe nga pjesa e parë, mund të gjenden në depo.

Në këtë artikull, ne do të zgjerojmë demonstrimin nga Pjesa 1 me një përmirësim të dukshëm në formën e kërkimit të aspekteve.

Le të fillojmë me index.php dhe t'i shtojmë linjat e mëposhtme:

$app->get("demo2", funksioni () përdor ($app) ( global $demo; $test2 = pinqDemo\Demo($app); kthe $test2->test2($app, $demo->test1 ($app)); $app->get("demo2/facet/(key)/(value)", funksioni ($key, $value) use ($app) ( global $demo; $test3 = new pinqDemo\Demo($app); ktheni $test3->test3($app, $demo->test1($app), $key, $value ));

Rruga e parë na çon në një faqe për të parë të gjitha hyrjet që përputhen me kërkimin fjalë kyçe. Për ta mbajtur shembullin të thjeshtë, ne zgjedhim të gjithë librat nga tabela libri_libër. Ai gjithashtu do të shfaqë grupin e të dhënave që rezulton dhe një grup lidhjesh për të specifikuar kriteret e kërkimit.

Në aplikacionet reale, pasi të klikoni në lidhje të tilla, të gjithë filtrat e aspekteve do të përshtaten me vlerat kufitare të grupit të të dhënave që rezulton. Kështu, përdoruesi do të jetë në gjendje të shtojë në mënyrë sekuenciale kushte të reja kërkimi, për shembull, së pari të zgjedhë një prodhues, pastaj të specifikojë një gamë çmimesh, etj.

Por në këtë shembull ne nuk do ta zbatojmë këtë sjellje - të gjithë filtrat do të pasqyrojnë vlerat kufitare të grupit të të dhënave origjinale. Ky është kufizimi i parë dhe kandidati i parë për përmirësim në demonstrimin tonë.

Siç mund ta shihni në kodin e mësipërm, funksionet aktuale ndodhen në një skedar tjetër të quajtur pinqDemo.php. Le të hedhim një vështrim në kodin përkatës që ofron veçorinë e kërkimit të fytyrave.

Klasa e aspektit

Hapi i parë është krijimi i një klase që përfaqëson një aspekt. Në përgjithësi, një aspekt duhet të përmbajë disa veti:

  • Të dhënat mbi të cilat funksionon ($data)
  • Çelësi me të cilin kryhet grupimi ($key)
  • Lloji i çelësit ($lloj). Mund të jetë një nga të mëposhtmet:
    • specifikoni vargun e plotë për një përputhje të saktë
    • tregoni një pjesë të vargut (zakonisht atë fillestar) për të kërkuar sipas modelit
    • tregoni një varg vlerash, për grupimin sipas diapazonit
  • nëse lloji i çelësit është një varg vlerash, ju duhet të përcaktoni një hap vlere për të përcaktuar kufijtë e poshtëm dhe të sipërm të diapazonit; ose nëse lloji është pjesë e një vargu, duhet të specifikoni se sa shkronja të para do të përdoren për grupim ($range)

Grupimi është pjesa më kritike e aspektit. I gjithë informacioni i grumbulluar që një aspekt mund të jetë në gjendje të kthejë varet nga kriteret e grupimit. Zakonisht termat më të përdorur të kërkimit janë " Linja e plotë"", "Pjesë e një vargu" ose "Diapazoni i vlerave".

Hapësira e emrit classFacet ( përdorni Pinq\ITraversable, Pinq\Traversable; klasa Facet ( publike $data; // Set origjinal i të dhënave publike $key; // fushë sipas së cilës grupohet publiku $type; // F: i gjithë rreshti; S: vargjet e fillimit R: gamë publike // luan një rol vetëm nëse $type != F ... funksioni publik getFacet() / e gjithë rreshti ( ... ) elseif ($this->type == "S") // fillimi i rreshtit ( ... ) elseif ($this->type == "R") // diapazoni i vlerave ​​( $ filter = $this->data ->groupBy(function($row) ( kati i kthimit ($row[$this->key] / $this->range) * $this->range; )) -> select(funksioni (ITtraversable $data) (ktheje ["key" => $data->last()[$this->key], "count" => $data->count()]; )); filtër ) ) )

Funksioni kryesor i kësaj klase është të kthejë një grup të dhënash të filtruar bazuar në të dhënat origjinale dhe vetitë e aspektit. Nga kodi është e qartë se për lloje të ndryshme përdoren llogaritë mënyra të ndryshme grupimi i të dhënave. Në kodin e mësipërm, ne treguam se si mund të duket kodi nëse grupojmë të dhënat sipas një sërë vlerash në rritje të specifikuara në $range.

Vendosja e aspekteve dhe shfaqja e të dhënave burimore

Funksioni publik test2($app, $data) ( $facet = $this->getFacet($data); return $app["twig"]->render("demo2.html.twig", array("facet" = > $facet, "data" => $data) funksioni privat getFacet($originalData) ($facet = array(); aspektoni objektet dhe ktheni aspektet $filter1 = new \classFacet\Facet($data, "autor", "F" = new \classFacet\Facet($data, "title", "S", 6) ; $facet[$filter3->key] = $filter3->getFacet();

Në metodën getFacet() bëjmë sa më poshtë:

  • Konvertoni të dhënat origjinale në një objekt Pinq\Traversable për përpunim të mëtejshëm
  • Ne krijojmë tre aspekte. Aspekti 'autor' do të grupojë sipas fushës së autorit dhe do të zbatojë grupimin sipas të gjithë rreshtit; aspekti 'titull' - sipas fushës së titullit me grupim sipas pjesës së rreshtit (nga 6 karakteret e para); aspekti 'çmimi' - sipas fushës së çmimit me grupim sipas diapazonit (në rritje prej 10)
  • Së fundi, ne nxjerrim aspektet dhe i kthejmë ato në funksionin test2 në mënyrë që ato të mund të dalin në shabllon për shfaqje
Dalja e aspekteve dhe e të dhënave të filtruara

Në shumicën e rasteve, filtrat do të shfaqen si një rresht dhe do t'ju çojnë të shikoni rezultatin e filtruar.

Ne kemi krijuar tashmë një rrugë ("demo2/facet/(çelës)/(vlera)") për të shfaqur rezultatet e kërkimit me pamje dhe lidhjet e filtrave.

Rruga merr dy parametra, në varësi të çelësit që filtrohet dhe vlerës për atë çelës. Funksioni test3 që lidhet me këtë rrugë është paraqitur më poshtë:

Testi i funksionit publik3($app, $originalData, $key, $value) ($data = \Pinq\Traversable::from($originalData); $facet = $this->getFacet($data); $filter = null nëse ($key == "autor") ( $filter = $data ->ku (funksioni($rresht) përdor ($value) (kthe $row["autor"] == $value;)) ->orderByAscending(funksioni($rresht) use ($key) ( return $row["price"]; )) ) elseif ($key == "price") ( ... ) else //$key== titull ( .. . ) return $app["twig"]->render("demo2.html.twig", array("facet" => $facet, "data" => $filter) )

Në thelb, në varësi të çelësit, ne aplikojmë filtrimin (një funksion anonim në deklaratën ku) sipas vlerës së kaluar dhe marrim grupin e mëposhtëm të të dhënave të filtruara. Mund të vendosim edhe rendin e filtrimit të të dhënave.

Së fundi, ne shfaqim të dhënat e papërpunuara (së bashku me filtrat) në shabllon. Kjo rrugë përdor të njëjtin model që kemi përdorur në "demo2".

Shiriti i Kërkimit

    (% për k, v në aspekt %)
  • ((k|kapitalizuar))
    • (% për vv në v %)
    • ((v.numër))((vv.çelës))
    • (%endfor%)
    (%endfor%)

Duhet të kujtojmë se aspektet e krijuara nga aplikacioni ynë janë vargje të mbivendosur. Në nivelin e parë, ky është një grup i të gjitha aspekteve dhe, në rastin tonë, ka tre prej tyre (përkatësisht për autorin, titullin, çmimin).

Çdo aspekt ka një grup me vlerë kyçe, kështu që ne mund të përsërisim mbi të duke përdorur metoda normale.

Vini re se si ndërtojmë URL-të për lidhjet tona. Ne përdorim të dy çelësat e lakut të jashtëm (k) dhe çelësat e lakut të brendshëm (vv.key) si parametra për rrugën ("demo2/facet/(key)/(vlera)"). Madhësia e vargjeve (vv.count) përdoret për shfaqje në shabllon.

Imazhi i parë tregon grupin origjinal të të dhënave dhe imazhi i dytë filtrohet sipas diapazonit të çmimeve nga 0 deri në 10 dollarë dhe renditet sipas autorit.

E shkëlqyeshme, ne ishim në gjendje të simulonim kërkimin me aspekte në aplikacionin tonë!

Përpara se të përfundojmë këtë artikull, duhet t'i hedhim një vështrim përfundimtar shembullit tonë dhe të përcaktojmë se çfarë mund të përmirësohet dhe çfarë kufizimesh kemi.

Përmirësime të mundshme

Në përgjithësi, ky është një shembull shumë themelor. Sapo kemi shqyrtuar sintaksën dhe konceptet bazë dhe i kemi zbatuar ato si një shembull pune. Siç u tha më parë, ne kemi disa fusha që mund të përmirësohen për fleksibilitet më të madh.

Ne duhet të zbatojmë kriteret e kërkimit "mbivendosje", pasi shembulli aktual na kufizon në aftësinë për të aplikuar filtrimin e kërkimit vetëm në grupin e të dhënave origjinale, ne nuk mund të aplikojmë kërkimin me anë të një rezultati tashmë të filtruar. Ky është përmirësimi më i madh që mund ta imagjinoj.

Kufizimet

Kërkimi i aspekteve i zbatuar në këtë artikull ka kufizime serioze (të cilat mund të zbatohen edhe për zbatimet e tjera të kërkimit të aspekteve):

Ne marrim të dhëna nga MySQL çdo herë

Ky aplikacion përdor kornizën Silex. Ashtu si çdo kornizë e vetme e pikës hyrëse si Silex, Symfony, Laravel, skedari i tij index.php (ose app.php) thirret sa herë që analizohet një rrugë dhe ekzekutohen funksionet e kontrolluesit.

Nëse shikoni kodin në index.php tonë, do të vini re se linja e mëposhtme e kodit:

$demo = pinqDemo i ri\Demo($app);

thirret sa herë që paraqitet faqja e aplikacionit, që do të thotë se linjat e mëposhtme të kodit ekzekutohen çdo herë:

Demoja e klasës ( $books private = ""; funksioni publik __construct($app) ( $sql = "zgjidh * nga porosia e librit_libër sipas id"; $this->books = $app["db"]->fetchAll($sql ;)

A do të jetë më mirë nëse nuk përdorim një kornizë? Epo, përkundër faktit se zhvillimi i aplikacioneve pa korniza nuk është një ide e mirë, mund të them se do të hasim të njëjtat probleme: të dhënat (dhe gjendja) nuk ruhen midis të ndryshmeve. Kërkesat HTTP. Kjo është një karakteristikë themelore e HTTP. Kjo mund të shmanget duke përdorur mekanizmat e memorizimit.

Kemi ruajtur disa pyetje SQL duke përdorur aspekte. Në vend që të kalonim një pyetje të përzgjedhur për të marrë të dhënat, dhe tre grupe sipas pyetjeve me klauzola ku korrespondojnë, ne ekzekutuam vetëm një ku query dhe përdorëm PINQ për të marrë informacionin e përmbledhur.

konkluzioni

Në këtë pjesë, ne kemi zbatuar aftësinë për të kërkuar nga ana e një koleksioni librash. Siç thashë, ky është vetëm një shembull i vogël, i cili ka vend për përmirësim dhe që ka një sërë kufizimesh.

( "pyetje": ( "dhe": [ ( "terms": ("vend": ["be", "fr"]) ), ( "terms": ("kategori": ["libra", "filma ""])) ])))

Për numëruesit, ne mund të përdorim grumbullime të integruara nga Elasticsearch. Secila nga dy aspektet ruhet si një fushë e vetme në indeks, kështu që ne mund të përdorim grumbullimin e termave në secilën prej këtyre fushave. Agregacioni do të kthejë një numërues për vlerën e kësaj fushe.

( "pyetje": ( "dhe": [ ( "terms": ("vend": ["be", "fr"]) ), ( "terms": ("kategori": ["libra", "filma " "]) ) ]), "agregacione": ( "vendet": ( "termet": ("fusha": "vend")), "kategoritë": ("termet": ("fusha": "kategoria" )))))

Nëse do të ekzekutonit këtë pyetje, do të vini re se numëruesit janë të çaktivizuar. Dy vendet e pazgjedhura, Portugalia dhe Brazili, kanë numërues 0. Edhe pse ka rezultate reale nëse duam t'i zgjedhim (për shkak të skajit ORinner). Kjo ndodh sepse, si parazgjedhje, Elasticsearch kryen grumbullimet e tij në grupin e rezultateve. Kjo do të thotë që nëse zgjidhni Francën, filtrat e vendit tjetër do të kenë një rezultat 0 sepse grupi i rezultateve përmban vetëm artikuj nga Franca.

Për ta rregulluar këtë, duhet t'i themi Elasticsearch që të kryejë grumbullimin në të gjithë grupin e të dhënave, duke injoruar pyetjen. Ne mund ta bëjmë këtë duke i përcaktuar grupimet tona si globale.

( "pyetje": ( "dhe": [ ( "terms": ("vend": ["be", "fr"]) ), ( "terms": ("kategori": ["libra", "filma " "]) ) ]), "agregacione": ( "të gjitha_produktet": ( "global": (), "grumbullime": ( "vendet": ( "kushtet": ("fusha": "vend")), " kategoritë": ( "termet": ("fusha": "kategoria") ) ) ) )

Nëse thjesht do ta bënim këtë, numëruesit tanë do të ishin gjithmonë të njëjtë, sepse ata gjithmonë do të mbështeteshin në të gjithë grupin e të dhënave, pavarësisht nga filtrat tanë. Njësitë tona duhet të bëhen pak më komplekse, që kjo të funksionojë duhet t'u shtojmë filtra atyre. Çdo grumbullim duhet të mbështetet në një grup të dhënash me të gjithë filtrat e aplikuar, përveç filtrave të tij. Kështu, grumbullimi sipas llogarisë në Francë mbështetet në grupin e të dhënave me filtrin e kategorisë të aplikuar, por jo në filtrin e vendit:

( "pyetje": ( "dhe": [ ( "terms": ("vend": ["be", "fr"]) ), ( "terms": ("kategori": ["libra", "filma " "]) ) ]), "agregacione": ( "të gjitha_produktet": ( "global": (), "agregacione": ( "vendet": ( "filtri": ( "dhe": [ ( "kushtet": ( "category": ["libra","filma"]) ) ] ), "agregations": ( "filtered_countries": ( "terms": ("fusha": "country") ) ) ), "categories": ( "filter": ( "dhe": [ ( "terms": ("vend": ["be","fr"]) ]), "agregacione": ( "filtered_categories": ( "terms": ( "fusha": "kategoria") ) ) ) ) ) )

( "mori": 153, "time_out": false, "_shards": ( "total": 5, "i suksesshëm": 5, "dështoi": 0), "goditje": ( "total": 3, "max_score" ": 0, "hits": ["..."]), "agregacione": ( "të gjitha_produktet": ( "numri_dokumenti": 21, "kategoritë e filtruara": ( "numri_dokumenti": 13, "kategoritë": ( "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ ( "key": "filma", "doc_count": 6 ), ( "key": "muzikë", "doc_count": 4 ), ( "kyç": "libra", "count_doc": 3 ) ) ), "filtered_countries": ( "doc_count": 15, "countries": ( "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "kova": [ ( "çelësi": "fr", "count_doc": 6 ), ( "çelës": "br", "llogari_doc": 4 ), ( "çelës": "be", "llogari_doc": 3 ), ( "key": "pt", "doc_count": 2 ) ) ) ) ) )

Frame Yii2 $terms = QueryHelper::terms("categories.name" , "kategoria ime" ); $nested = QueryHelper:: mbivendosur ("string_facet" , QueryHelper:: filtër ([ QueryHelper:: term ("string_facet.facet_name" , [ "value" => $id , "boost" => 1 ] ), QueryHelper:: termi ("string_facet.facet_value" , ​​[ "value" => $value, "boost" => 1 ]) , ] ) ); $filter = QueryHelper::duhet ($nested) ;

Në mësimin e sotëm, ne do të përpiqemi të rikrijojmë një imitim të kërkimit të aspekteve duke përdorur Javascript. Unë supozoj se ju tashmë e dini se çfarë është kërkimi me anë të kërkimit nëse po lexoni këtë tutorial, përndryshe kërkoni në Google ose shikoni Amazon ose Demon time.

Së pari na duhet biblioteka github.com/eikes/facetedsearch. Shkarkoni atë dhe lidhni skedarin facetedsearch.js me projektin tonë. Do të na duhen gjithashtu bibliotekat jQuery dhe Underscore.

Mohim përgjegjësie: E kuptoj që JQ nuk është më një tortë, por e përdor si sheqer sintaksor të njohur, mund ta rishkruash për bibliotekat më të njohura për ty ose në vanilje JS.

Pra, së pari, le të bëjmë një shënim të thjeshtë me varësi të lidhura:

Dokumenti // Këtu do të shfaqim filtrat e aspekteve // ​​Dhe këtu do të jenë elementët tanë

Tani duhet të përshkruajmë cilësimet e aplikacionit tonë dhe të krijojmë një shabllon për shfaqjen e elementeve të grupit që do t'i renditim duke përdorur aspekte:

$(funksion())( var item_template = // Përshkruani shabllonin "" + " " class="img-responsive">" + ", " + "

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

" + "

" + ""; cilësimet = ( artikuj: shembull_artikuj, aspekte: ( // Specifikoni kategoritë e aspekteve "kategori" : "Çfarë kategorie", "kontinent" : "Cili kontinent", "gjuhë" : "Gjuhë programimi"), Zgjedhësi i rezultateve: "#results", // Elementi DOM ku shfaqim rezultatet facetSelector: "#facets", // Elementi DOM për aspektet resultTemplate: item_template, paginationCount: 8, // Numri i elementeve për faqe orderByOptions: ("emri": " Emri ", "mbiemri": "Mbiemri", "kategoria": "Kategoria", "RANDOM": "Random"), facetSortOption: ("kontinenti": ["Amerika e Veriut", "Amerika e Jugut"]) ) $ facetelize (cilësimet);

Epo, në të vërtetë krijoni vetë një grup JSON me elementë për t'u shfaqur në kërkimin tonë të aspekteve në JS:

Var artikuj = [ ( "emri": "Mary", "mbiemri": "Smith", "imageURL": "http://lorempixel.com/150/150/cats/2", "përshkrim": "Sed Ea Amet. ", "mbiemri": "Johnson", "imageURL": "http://lorempixel.com/150/150/cats/3", "përshkrim": "Ut Takimata Sit Aliquyam Labore Aliquyam Sit Sit Lorem Amet ." , "kategori": "Luan", "kontinent": "Amerika e Veriut", ... ];

Unë do ta vendos këtë grup në një skedar të veçantë JS që do të gjenerohej në mënyrë dinamike, për shembull nga një bazë të dhënash.

Kjo është e gjitha, ne marrim një kërkim të thjeshtë në JavaScript dhe mund ta personalizojmë atë. Më pas, unë jap dokumentacionin e përkthyer të bibliotekës, ku mund të shihni shkaktarët që ju nevojiten.

Karakteristikat e dokumentacionit

Dy funksione eksportohen në hapësirën e emrave jQuery.

facetelize Përdoret për të inicializuar një kërkim me fytyra me cilësimet e dhëna.

facetUpdate Mund të përdoret nëse dëshironi të ndryshoni gjendjen e kërkimit të aspektit nga jashtë.

Cilësimet e objektit

artikuj: Një grup artikujsh që do të filtrohen dhe renditen gjatë procesit.

aspektet: Një objekt, çelësat e të cilit korrespondojnë me çelësat dhe vlerat e elementeve është kreu për atë aspekt. Artikujt do të filtrohen në bazë të vlerës që kanë për këta çelësa.

orderByOptions: Ngjashëm me aspektet, përveç se këto çifte çelës-vlerë përdoren vetëm për renditje. Kur aktivizohet tasti RANDOM, rezultatet mund të randomizohen.

facetSelector: Ky është një përzgjedhës që përdoret për të gjetur një nyje DOM nga e cila përzgjidhen filtrat e aspekteve.

resultSelector: Ky është një përzgjedhës që përdoret për të gjetur nyjen DOM ku shfaqen rezultatet.

resultTemplate: Një varg që përdoret nga motori i modelit Underscore për të dhënë çdo element nga grupi i artikujve. Secilit element i shtohen atributet e mëposhtme, të cilat mund të përdoren gjithashtu në shabllon: batchItemNr, batchItemCount dhe totalItemCount.

gjendje: Ky objekt ruan filtrat aktualë, rendit: aktualRezultatin dhe të tjerët. Ju mund të jepni një varg orderBy ose një objekt filtri për t'i paracaktuar ato.

enablePagination: Boolean për të aktivizuar pagimin dhe butonin "ngarkoj më shumë", parazgjedhja është e vërtetë.

PaginationCount: Nëse paginatori është i aktivizuar, cakton numrin e elementeve për faqe, parazgjedhja është 50.

facetSortOption: Përdoreni këtë funksion për të ndryshuar rendin e elementeve të aspektit. Merr një objekt, çelësat e të cilit korrespondojnë me emrat dhe vlerat e aspekteve në një grup vlerash të aspekteve, të cilat mund të renditen sipas renditjes që dëshironi të jenë. Ky shembull do t'i rendit kontinentet në një rend tjetër, duke shtuar artikujt që nuk përfshihen në grup sipas rendit alfabetik:

FacetSortOption: ("kontinent": ["Amerika e Veriut", "Amerika e Jugut"])

Ka disa shabllone të tjera, ju lutemi hidhini një sy burimi facetedsearch.js për të parë të gjitha opsionet e disponueshme të shabllonit.

Ngjarjet

Mund të lidheni me disa ngjarje të cilat duhet të dërgojnë njoftime kur kanë ndodhur disa veprime. Për ta bërë këtë, ne përdorim sistemin e ngjarjeve jquery:

facetuicreated: Ju mund ta lidhni këtë funksion me elementin settings.facetSelector DOM i cili duhet të njoftohet kur të jetë krijuar UI.

facetedsearchresultupdate: Mund ta lidhni këtë funksion me elementin settings.resultSelector DOM për t'u njoftuar për rezultatet e përditësimit.

facetedsearchfacetclick: Kjo ngjarje aktivizohet kur një aspekt klikohet dhe aktivizohet në elementin settings.facetSelector. E cila merr si argument id-në e aspektit.

facetedsearchorderby: Kjo ngjarje aktivizohet kur elementi i renditjes klikohet në elementin settings.facetSelector. Merr si argument urdhrin e ID-së.

$(settings.resultSelector).bind("facetedsearchresultupdate", funksion())( // bëj diçka, ndoshta ));

Njerëzit modernë po përpiqen të shpenzojnë gjithnjë e më pak kohë në blerje. Katalogët e ngadaltë të produkteve largojnë klientët, dyqani humb klientët dhe një pjesë të fitimeve të tij. Bëjeni dyqanin tuaj online më tërheqës me teknologjinë Facet - d.m.th. të paracaktuara.

Shënim: Mekanizmi i kërkimit të faqeve është i disponueshëm nga versioni 15.0.1 i modulit të blloqeve të informacionit dhe është i integruar me komponentin Një komponent është një kod programi i krijuar në një guaskë vizuale që kryen një funksion specifik të një moduli për të shfaqur të dhënat në Publik pjesë. Ne mund ta fusim këtë bllok kodi në faqet e internetit pa shkruar asnjë kod drejtpërdrejt. Filtri inteligjent Komponenti përgatit një filtër për zgjedhje nga një bllok informacioni dhe shfaq një formular filtri për filtrimin e elementeve. Komponenti duhet të lidhet përpara komponentit për shfaqjen e elementeve të katalogut, përndryshe lista e elementeve nuk do të filtrohet. Komponenti është standard, i përfshirë në shpërndarjen e modulit dhe përmban tre shabllone: ​​.default, visual_horizontal dhe visual_vertical. (Dy shabllonet e fundit nuk mbështeten, ato mbeten për të ruajtur përputhshmërinë.)

Në redaktuesin vizual, komponenti ndodhet përgjatë shtegut Përmbajtja > Katalogu > Filtri inteligjent.

Komponenti i përket modulit të blloqeve të informacionit.

Mësoni më shumë rreth kërkimit me aspekte

Le të shohim një shembull:

Shkojmë në dyqanin online dhe zgjedhim në filtër që na duhet një bluzë e kuqe:

  • Pa kërkim të rrafshët, filtri do të fillonte të përsëritej në të gjithë listën e produkteve për të përshtatur produktin "T-shirt" me veçorinë e ngjyrës "E kuqe", e cila do të merrte shumë kohë nëse do të kishte një numër të madh produktesh;
  • Nëse vendosni një kërkim me anë, atëherë grupet e gatshme të kërkimit të produkteve krijohen për një vlerë të caktuar të pronës (indekset e aspekteve), d.m.th. opsionet për kërkesat e mundshme Për shembull, një bluzë e kuqe, të gjitha produkte pambuku të zinj, fustane në madhësinë XS, etj. në filtrin inteligjent llogariten paraprakisht dhe rezultati shfaqet menjëherë. Ky lloj kërkimi i produktit është shumë më i shpejtë.

Le të krijojmë indekse të ndryshme në disa hapa të thjeshtë:

A duhet të rikrijohen indekset e aspekteve?

Indekset e aspekteve rikrijohen automatikisht ose ju duhet t'i rikrijoni ato me dorë, në varësi të veprimeve të kryera:

Automatikisht Shtuar produkte të reja ose modifikuar ekzistues.
mos krijoni veti të reja.
Me dorë Sistemi do t'ju kërkojë për këtë duke përdorur një mesazh në krye të faqeve
seksioni administrativ.
Shtuar seksione të reja ose të redaktuara të katalogut.
Kur shtoni një të re ose hiqni një pronë nga një filtër inteligjent.
Kur shkarkoni mallra, për shembull, nga 1C, nëse mallrat krijojnë prona të reja.

Kërkimi i aspekteve përmirëson performancën e katalogut të produkteve. Për ta përdorur atë ju duhet:

  • Krijoni indekse të ndryshme për një katalog produktesh;
  • Shikoni për njoftime në lidhje me nevojën për të rikrijuar manualisht indekset.
  • Publikime mbi temën