Căutare de trei ori mai rapidă: interogări multiple și căutare fațetă. Modulul de căutare fațetă - căutați folosind „clarificări”

Organizează așa-numita căutare fațetă (navigație fațetă) pe site. Înțelesul său este că rezultatele căutării pot fi rafinate folosind diverse caracteristici material - autor, tip, termen, data creării etc.

De exemplu, dacă aveți un magazin online care vinde echipamente electronice, iar utilizatorul introduce expresia casetofon. Pe pagina de rezultate, pe lângă rezultatele în sine, vor exista fațete:

- Capitol: echipament audio (54), tehnologia calculatoarelor (85)
- Marca: Apple (25), Samsung (68), iRiver (78)
- Disponibilitate in stoc: da (456), nu (12)
- Preț: 100-1000$ (45), 1000-10000$ (12)

etc. Numărul de produse (noduri) care îndeplinesc aceste caracteristici va fi indicat între paranteze. Făcând clic pe linkuri, utilizatorul va restrânge rezultatele căutării.


Pe de o parte, aceasta este o alternativă la filtrele extinse din Vizualizări, pe de altă parte, o alternativă la căutarea avansată standard.

Instalare

Secțiunea de fațete

În această secțiune, puteți specifica ce fațete să utilizați atunci când căutați. De exemplu, vă permiteți să selectați materiale în funcție de taxonomie, dată de adăugare sau autor. Numărul de fațete depinde de modulele incluse.

Secțiunea paginii cu rezultate

Stilul de afișare- stilul de afișare a rezultatelor căutării: Extraseînseamnă a ieși ca și cum căutare regulată(text evidențiat, autor, dată); Teasers-uriînseamnă afișarea teasers-urilor de materiale folosind nodul corespunzător.tpl.php.

Utilizați stilul de afișare Extras în mod selectiv- Dacă opțiunea este bifată, atunci stilul Extrase va fi aplicat întotdeauna dacă este introdus un cuvânt cheie. Dacă nu bifați această opțiune, puteți utiliza modulul ca înlocuitor pentru navigarea în termenii taxonomiei.

Secțiunea de căutare curentă

Vă permite să activați blocul Căutare curentă , care afișează termenii de căutare:

Bonusul Facet API pentru Drupal 7 este o colecție de pluginuri suplimentare Facet API și funcţionalitate, în primul rând filtre și pluginuri de dependență - și un loc pentru a stoca cele mai multe extensii suplimentare Facet API.

În prezent, Facet API Bonus include:

Dependența de fațete: plugin de dependență pentru a face o fațetă (de exemplu, „categoria de produs”) să fie afișată în funcție de alte fațete sau elemente active specifice fațetei (de exemplu, „tipul de conținut” este „produs” sau „serviciu”) . Foarte flexibil, acceptă mai multe fațete pentru dependențe, precum și o expresie regulată pentru determinarea dependențelor unui element cu fațete, precum și un parametru pentru comportamentul în cazul în care dependența este pierdută.

„Excludeți articole”: Filtrați pluginul pentru a exclude anumite elemente fațetate după marcaj/nume sau valoarea lor internă (de exemplu, excluderea „paginilor” din „tipurile de conținut”) Sunt posibile și expresii regulate.

(Va urma...)

Cum să afișați căutarea cu fațete pe pagini fără fațete

Există momente când în timpul dezvoltării unui site web este necesară afișarea fațetelor de căutare pe pagini fără fațete. De exemplu, doriți să fie afișate cele mai populare categorii pagina principala, împreună cu contoarele corespunzătoare. Atunci când un vizitator al site-ului face clic pe o categorie, el ar trebui să fie redirecționat către o căutare pe site, cu categoria pe care ați făcut clic selectată în fațete.

Pentru a face toate acestea, există un bloc de afișare View Facets oferit de submodulul search_api_facetapi

Cu acesta, puteți utiliza cu ușurință link-uri fațete pentru orice căutare pe orice pagină doriți. În acest scop există două opțiuni:

Afișați fațete direct în blocul de vizualizare

Este necesar fie să creați o nouă vizualizare pe baza index de căutare, pe care doriți să-l utilizați sau modificați vechea vizualizare. Adăugați un tip de afișare „Bloc de fațete” pentru a vizualiza și configura „câmpul de fațete” și „Calea paginii de căutare” în „Configurare bloc”.

Fațetele nu vor fi trimise către previzualizare, așa că pentru a vă testa vizualizarea, activați noul bloc de fațete de vizualizare accesând Administrare > Structură > Blocuri, așa cum faceți în mod normal pentru toate celelalte blocuri. Configurați blocul astfel încât să apară pe acele pagini pe care trebuie să îl afișați.

Configurați orice filtre (contextuale) pe care doriți să le aplicați rezultatului care este utilizat pentru link-urile cu fațete (de exemplu, luați în considerare numai categoriile pentru nodurile publicate de un anumit tip de conținut). Filtrele expuse sunt ignorate. Setările de format și de marjă sunt ignorate, dar puteți modifica setările și făcând clic pe „Altele”.

O listă de link-uri fațete va fi afișată pe paginile care au fost specificate.

Cu toate acestea, există câteva limitări ale acestei opțiuni:

Linkurile cu fațete vor fi formatate întotdeauna ca o listă, nu va fi posibilă suprascrierea sau formatarea selecției.
În special, nu este posibil să utilizați widget-uri API Facet obișnuite pentru aceste fațete. Acest lucru se datorează faptului că este destul de greu de realizat reutilizare Componentele Facet API din afara Facet API.
Dacă doriți să afișați fațete pentru mai mult de un câmp, trebuie să adăugați afișări _view suplimentare pentru blocul de fațete și fiecare va efectua o interogare de căutare separată atunci când este afișat.

Pentru a rezolva aceste deficiențe, există o a doua opțiune:

De asemenea, puteți utiliza doar afișarea blocurilor de fațete pentru a efectua căutarea, apoi utilizați API-ul obișnuit Facet pentru blocurile de fațete pentru a afișa fațetele din ele. Pentru a face acest lucru, creați o afișare a blocului de fațete ca înainte, dar setați opțiunea „Ascunde blocul” în setările blocului. Astfel, pe paginile pe care apare blocul se execută interogarea de căutare, dar blocul va fi ascuns.

Acum puteți crea blocuri de fațete pentru această căutare ca de obicei, în pagina de index din fila Fațete. Trebuie doar să vă asigurați că fața este activă pentru afișarea blocului de fațete (de obicei, ID-ul va fi search_api_views: -facets_block) în „Afișare pentru căutări” / „Căutare ID-uri Apoi, pot fi utilizate toate opțiunile obișnuite ale Facet API”. pentru a defini vizualizarea și comportamentul blocurilor de fațete afișate Fațetele din aceste blocuri vor folosi automat calea dată în blocurile de fațete de vizualizare în setările „Căutare în pagină”.

Cu toate acestea, există și câteva probleme cu această abordare: în primul rând, în prezent nu este posibil să se deducă aceeași fațetă în două locuri diferite(#1411160: Permiteți unei fațete să apară de mai multe ori în aceeași sferă). Astfel, lista de fațete de pe pagina principală ar trebui să fie în aceeași zonă și locație pentru căutare și să fie stilată la fel. Pentru a ocoli acest lucru în orice mod (fie prin clonarea blocului cu fațete, fie prin modificarea afișajului pentru a muta blocul) în prezent necesită încă codare (cu excepția cazului în care utilizați panouri (sau ceva similar) pentru a afișa blocurile).

A doua problemă este aceeași cu cea descrisă în Întrebările frecvente ale API-ului de căutare - pentru ca blocurile cu fațete să funcționeze, trebuie să vă asigurați că vizualizarea este executată înainte ca blocurile să fie randate. Cu toate acestea, deoarece puteți pune blocul de vizualizare în orice regiune (din moment ce nu va fi redat oricum), nu ar trebui să fie o problemă prea mare pentru a găsi o poziție în care această cerință este satisfăcută.

Adăugarea unui bloc de fațete la un panou

De ce ar putea să nu funcționeze tot ceea ce este descris mai sus despre fațete, căutare de fațete și blocuri de fațete?

Se dovedește că atunci când blocurile de fațete sunt ascunse și plasate în aceeași regiune, acestea trebuie, de asemenea, să fie situate mai sus decât filtrele de fațete afișate în aceeași regiune. Dacă blocurile sunt mai jos, atunci nimic nu funcționează. De îndată ce mutați blocurile de fațete deasupra filtrelor și le ascundeți, filtrele de fațete încep să apară pe toate paginile.

Afișați ultimul nivel de taxonomie ierarhică în mai multe fațete

O caracteristică utilă va împărți automat dicționarul ierarhic, după care fiecare nivel va primi propriul bloc de fațete și etichetă personalizată. Se pare că acest modul are deja o opțiune de a rescrie o singură fațetă. Prin urmare, suntem deja la jumătatea drumului. Cât de dificil ar fi să generezi un bloc de fațete pentru fiecare nivel?

Această opțiune va fi utilă în special pentru categoriile de produse în care termenii pot avea mai mulți părinți, de exemplu, „mărime” sau „culoare”. Dacă sunt afișate în blocuri separate, utilizatorului este mult mai clar cum să navigheze în fațete în loc să navigheze într-un arbore de fațete uriaș în care termenii sunt afișați de mai multe ori...

Xhit Informatii utile despre toate acestea aici

Traducerile se bazează pe paginile următoare.

Am aruncat o privire rapidă asupra instalării și sintaxei de bază a PINQ, portate la versiunea PHP LINQ. În acest articol, vom analiza cum să folosiți PINQ pentru a simula caracteristica de căutare fațetă în MySQL.

În acest articol nu vom acoperi toate aspectele căutării fațetate. Persoanele interesate pot căuta informații adecvate pe Internet.

Tipic căutarea fațetelor functioneaza astfel:

  • Utilizatorul introduce un cuvânt cheie sau mai multe cuvinte cheie pentru a căuta. De exemplu, „router” pentru a căuta produse în care cuvântul „router” apare în descriere, cuvinte cheie, numele categoriei, etichete etc.
  • Site-ul returnează o listă de produse care corespund acestor criterii.
  • Site-ul oferă mai multe link-uri pentru a vă personaliza termenii de căutare. De exemplu, vă poate permite să specificați producători specifici routere sau setați o gamă de prețuri sau alte caracteristici.
  • Utilizatorul poate continua să specifice criterii suplimentare căutare pentru a obţine setul de date de interes.

Căutarea fațetă este foarte populară și este Unealtă puternică, poate fi observat pe aproape orice site web legat de comerțul electronic.

Din păcate, căutarea fațetă nu este încorporată în MySQL. Deci, ce ar trebui să facem dacă încă folosim MySQL, dar vrem să oferim utilizatorului această oportunitate?

Cu PINQ, care are o abordare similară, puternică și simplă, putem obține același comportament ca și când am folosi alte motoare de baze de date.

Extinderea demo din prima parte

cometariu: Tot codul din această parte și din prima parte poate fi găsit în depozit.

În acest articol, vom extinde demonstrația din partea 1, cu o îmbunătățire semnificativă a căutării fațete.

Să începem cu index.php prin adăugarea următoarele rânduri:

$app->get("demo2", function () use ($app) ( global $demo; $test2 = nou pinqDemo\Demo($app); return $test2->test2($app, $demo->test1 ($app)); $app->get("demo2/facet/(key)/(value)", function ($key, $value) use ($app) ( global $demo; $test3 = new pinqDemo\Demo($app); returnează $test3->test3($aplicație, $demo->test1($aplicație), $cheie, $valoare ));

Primul traseu ne duce la o pagină pentru a vizualiza toate postările care se potrivesc cu căutarea prin cuvinte cheie. Pentru a păstra exemplul simplu, selectăm toate cărțile din tabelul book_book. De asemenea, va afișa setul de date rezultat și un set de link-uri pentru a specifica criteriile de căutare.

În aplicațiile reale, după ce faceți clic pe astfel de linkuri, toate filtrele de fațete se vor ajusta la valorile limită ale setului de date rezultat. Utilizatorul va putea astfel să adauge secvenţial noi condiţii de căutare, de exemplu, mai întâi selectează un producător, apoi specifică un interval de preţ etc.

Dar în acest exemplu nu vom implementa acest comportament - toate filtrele vor reflecta valorile limită ale setului de date original. Aceasta este prima limitare și primul candidat pentru îmbunătățire în demonstrația noastră.

După cum puteți vedea în codul de mai sus, funcțiile reale sunt localizate într-un alt fișier numit pinqDemo.php. Să aruncăm o privire la codul corespunzător care oferă funcția de căutare fațetă.

Clasa de aspect

Primul pas este crearea unei clase care să reprezinte un aspect. În general, un aspect ar trebui să conțină mai multe proprietăți:

  • Datele pe care operează ( $date)
  • Cheia prin care se realizează gruparea ( $key)
  • Tip cheie ($type). Poate fi una dintre următoarele:
    • specificați șirul complet pentru o potrivire exactă
    • indicați o parte a șirului (de obicei cea inițială) pentru a căuta după model
    • indicați un interval de valori, pentru grupare după interval
  • dacă tipul de cheie este un interval de valori, trebuie să definiți un pas de valoare pentru a determina limitele inferioare și superioare ale intervalului; sau dacă tipul face parte dintr-un șir, trebuie să specificați câte primele litere vor fi folosite pentru grupare ($range)

Gruparea- partea cea mai critică a aspectului. Toate informațiile agregate pe care un aspect le poate returna depinde de criteriile de grupare. De obicei, cei mai folosiți termeni de căutare sunt „ Linie completă”, „Parte dintr-un șir” sau „Interval de valori”.

Spațiul de nume classFacet ( utilizați Pinq\ITraversable, Pinq\Traversable; clasa Facet (public $date; // Setul original de date public $key; // câmp prin care se grupează public $type; // F: întreg rândul; S: șiruri de început ; R: public $range // joacă un rol numai dacă $type != F ... public function getFacet() ( $filter = ""; if ($this->type == "F") / / întreaga linie ( ... ) elseif ($this->type == "S") // începutul liniei ( ... ) elseif ($this->type == "R") // interval de valori ​​( $ filter = $this->data ->groupBy(function($row) ( return floor($row[$this->key] / $this->range) * $this->range; )) -> select(funcție (ITraversable $date) ( return ["key" => $data->last()[$this->key], "count" => $data->count()]; )); filtru; ) ) )

Funcția principală a acestei clase este de a returna un set filtrat de date bazat pe set original date și proprietăți ale aspectului. Din cod se vede clar ca pt tipuri variate conturile folosesc moduri diferite de a grupa datele. În codul de mai sus am arătat cum ar putea arăta codul dacă grupăm datele după un interval de valori în trepte specificate în $gamă.

Setarea aspectelor și afișarea datelor sursă

Funcție publică test2($app, $date) ( $fațetă = $this->getFacet($date); return $app["cremură"]->render("demo2.html.twig", array("fațetă" = > $fațetă, "date" => $date)); funcție privată getFacet($originalData) ( $fațetă = array(); $date = \Pinq\Traversable::from($originalData); // 3 exemple de creare diferite obiecte aspect și returnează aspectele $filter1 = new \classFacet\Facet($date, "autor", "F" $filter2 = new \classFacet\Facet($date, "title", "S", 6) ; $filter3 = new \classFacet\Facet($date, "preț", "R", 10 $filter1->key] = $filter1->getFacet(); ); $fațetă[$filter3->key] = $filter3->getFacet();

În metoda getFacet() facem următoarele:

  • Convertiți datele originale într-un obiect Pinq\Traversable pentru procesare ulterioară
  • Creăm trei aspecte. Aspectul „autor” va grupa după câmpul de autor și va implementa gruparea după întregul rând; aspect 'titlu' - după câmpul titlu cu grupare pe o parte a rândului (cu primele 6 caractere); aspectul „preț” - după câmpul de preț cu grupare după interval (în trepte de 10)
  • În cele din urmă, extragem aspectele și le returnăm la funcția test2, astfel încât să poată fi afișate în șablon pentru afișare

Aspecte de ieșire și date filtrate

În cele mai multe cazuri, filtrele vor fi afișate ca o linie și vă vor conduce la vizualizarea rezultatului filtrat.

Am creat deja o rută ("demo2/facet/(key)/(value)") pentru a afișa rezultate de căutare cu fațete și pentru a filtra linkurile.

Traseul are doi parametri, în funcție de cheia filtrată și de valoarea cheii respective. Funcția test3 care este legată de această rută este prezentată mai jos:

Funcție publică test3($app, $originalData, $key, $value) ($date = \Pinq\Traversable::from($originalData); $facet = $this->getFacet($data); $filter = null; if ($cheie == "autor") ( $filtru = $date ->unde(funcție($rând) folosește ($valoare) ( ​​return $rând["autor"] == $valoare; )) ->orderByAscending( function($row) use ($key) ( return $row["preț"]; )) ) elseif ($key == "preț") ( ... ) else //$key== titlu ( .. . ) return $app["twig"]->render("demo2.html.twig", array("fațetă" => $fațetă, "date" => $filtru) )

Practic, în funcție de cheie, aplicăm filtrarea (o funcție anonimă în instrucțiunea where) în funcție de valoarea transmisă și obținem următorul set de date filtrate. De asemenea, putem seta ordinea de filtrare a datelor.

În cele din urmă, afișăm datele brute (împreună cu filtre) în șablon. Această rută folosește același model pe care l-am folosit în „demo2”.

Bara de căutare

    (% pentru k, v în fațetă %)
  • ((k|majusculă))
    • (% pentru vv în v %)
    • ((v. număr))((v.cheie))
    • (%endfor%)
    (%endfor%)

Trebuie să ne amintim că aspectele generate de aplicația noastră sunt matrice imbricate. La primul nivel, aceasta este o serie de toate aspectele și, în cazul nostru, există trei dintre ele (pentru autor, titlu, respectiv preț).

Fiecare aspect are o matrice cheie-valoare, astfel încât să putem repeta peste el folosind metode normale.

Observați cum construim adresele URL pentru link-urile noastre. Folosim atât cheia buclă exterioară (k), cât și cheile buclei interioare (vv.key) ca parametri pentru rută ("demo2/facet/(key)/(value)"). Mărimea matricelor (vv.count) este utilizată pentru afișare în șablon.

Prima imagine arată setul de date original, iar a doua imagine este filtrată în funcție de intervalul de preț de la 0 USD la 10 USD și sortată după autor.

Grozav, am reușit să simulăm căutarea fațetă în aplicația noastră!

Înainte de a finaliza acest articol, trebuie să aruncăm o privire finală asupra exemplului nostru și să stabilim ce poate fi îmbunătățit și ce limitări avem.

Posibile îmbunătățiri

În general, acesta este un exemplu foarte simplu. Tocmai am trecut peste sintaxa și conceptele de bază și le-am implementat ca exemplu de lucru. După cum sa menționat anterior, avem mai multe domenii care ar putea fi îmbunătățite pentru o mai mare flexibilitate.

Trebuie să implementăm un criteriu de căutare „suprapus”, deoarece exemplul actual ne limitează la a putea aplica numai filtrarea de căutare pentru set original date, nu puteți aplica căutarea fațetă unui rezultat deja filtrat. Aceasta este cea mai mare îmbunătățire pe care mi-o pot imagina.

Restricții

Căutarea de fațete implementată în acest articol are limitări serioase (care se pot aplica și altor implementări de căutare de fațete):

Preluăm date de la MySQL de fiecare dată

Această aplicație folosește cadrul Silex. Ca orice cadru cu punct de intrare unic, cum ar fi Silex, Symfony, Laravel, fișierul său index.php (sau app.php) este apelat de fiecare dată când o rută este analizată și sunt executate funcțiile controlerului.

Dacă te uiți la codul din index.php nostru, vei observa că următoarea linie de cod:

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

este apelat de fiecare dată când pagina aplicației este redată, ceea ce înseamnă că următoarele linii de cod sunt executate de fiecare dată:

Demo clasă ( private $books = ""; funcția publică __construct($app) ( $sql = "selectați * din book_book order by id"; $this->books = $app["db"]->fetchAll($sql ;

Va fi mai bine dacă nu folosim un cadru? Ei bine, în ciuda faptului că dezvoltarea de aplicații fără cadre nu este o idee bună, pot spune că ne vom confrunta cu aceleași probleme: datele (și starea) nu sunt păstrate între diferite solicitări HTTP. Aceasta este o caracteristică fundamentală a HTTP. Acest lucru poate fi evitat prin utilizarea mecanismelor de stocare în cache.

Am salvat mai multe interogări SQL utilizând aspecte. În loc să transmitem o interogare de selecție pentru a prelua datele și trei interogări grupate după clauzele corespunzătoare, am rulat doar o interogare unde și am folosit PINQ pentru a obține informațiile agregate.

Concluzie

În această parte, am implementat capacitatea de a căuta fațete într-o colecție de cărți. După cum am spus, acesta este doar un mic exemplu, care are loc de îmbunătățire și care are o serie de limitări.

Conținutul articolelor:
Articolul precedent:

Fațetele sunt constrângeri definite pentru tipul de valoare XDTO. O fațetă definește tipul constrângerii și valoarea constrângerii. De exemplu [Maximum inclusiv - 5]. Tipul de valoare XDTO poate stoca mai multe fațete, dar tipurile acestora trebuie să fie unice, adică nu puteți specifica două fațete [Maximum inclusiv - 5] și [Maximum inclusiv - 3].

În acest articol vreau să arăt cum puteți utiliza fațete pentru a verifica intrările și cum să creați un parametru de operație ws de tip compozit.

Să stabilim o sarcină simplă - încărcați articole printr-un serviciu web. Vom încărca codul, numele, prețul și soldul în magazin. Dar directorul poate fi foarte mare, așa că atunci când apelați operația ws ar trebui să fie posibilă setarea selecției. Vom selecta după codul articolului.

Să creăm o nouă bază de date și să adăugăm pachet nou XDTO, să-l numim PackageXDTO, indică spațiul de nume.

Apoi, adăugați un tip de valoare la pachet, așa cum se arată în figură.


Să creăm un tip „Cod” pentru a organiza selecția după un identificator unic de articol. Respectiv, tip nou„Codul” poate fi obținut de la tip șir prin adăugarea unei limite de caractere. Ar trebui să existe 9 caractere, adică numărul de caractere din codul nomenclatorului. Pentru fața „Caractere de spațiu”, setați valoarea la „restrângere”, acest lucru vă va permite să afișați o eroare dacă există spații în cod.


Acum să creăm tipul de valoare „Preț” în același mod. Pentru aceasta vom seta minim la 0, maxim la 1.000.000.


Pentru a rezolva problema, vom crea o carte de referință de nomenclatură, vom stoca restul într-unul dintre detaliile sale - acest lucru nu este important.


Ei bine, acum să începem să creăm un serviciu web. Să-i spunem „Rămășițe” și să adăugăm 3 parametri:
  • Codul este tipul de cod pe care l-am creat anterior. De acest parametru Vom stabili selecția pe baza codului articolului;
  • PriceFrom - tip Price. Aceasta este limita inferioară a prețului unui produs;
  • PriceBefore - tip Preț. Aceasta este limita superioară a prețului unui produs.

Pentru ca serviciul web să afișeze o serie de produse, fiecare dintre ele având un cod, un nume, un preț și un echilibru, să creăm un obiect „Nomenclatură” XDTO în care specificăm câmpurile:

  • Cod - tip Cod;
  • Nume - tip șir;
  • Pret - tip Pret;
  • Rest - tastați int

Și să creăm un obiect XDTO „Produse”, care va avea o singură proprietate „Nomenclatură”, dar cu posibilitatea de a-l afișa ca listă. Pentru tipul câmpului „Nomenclatură” al obiectului „Produse”, specificați obiectul „Nomenclatură”. Puteți citi mai multe despre cum să treceți o matrice printr-un serviciu web.

Să trecem la proprietățile operațiunii „Rămășițe”. Să specificăm tipul de valoare returnată - „Produse” și să deschidem modulul acestuia. Să scriem următorul cod:

Funcția rămâne (Cod, PriceFrom, PriceTo)

Solicitare = Solicitare nouă;
Cerere . Text =
"ALEGE
|Nomenclatură.Cod,
|Nomenclatură.Nume,
|Nomenclatură.Preț,
|Nomenclatură.Resume
|DIN
|Director.Nomenclatura AS Nomenclatura
|UNDE
|1 = 1
|Și 2 = 2" ;

DacăValueFilled(Cod)
ȘI Cod<>„000000000” Atunci
Cerere . Text = StrInlocuire(Interogare . Text , " 1 = 1 " , " Nomenclatură.Cod = &Cod" );
Cerere . SetParameter(„Cod”, Cod);
endIf;

Dacă nu PriceFrom = PriceToThen
Cerere . Text = StrReplace (Interogare . Text , „2 = 2” , „Nomenclatură. Preț ÎNTRE &PriceFrom ȘI &PriceTo”);
Cerere . SetParameter("PriceDo", PriceDo);
Cerere . SetParameter("Prețul de la", Prețul de la);
endIf;

Rezultatul interogării= Solicitare. Alerga();

SelectionDetailedRecords= Rezultatul interogării. Alegeți ();
TypeXDTOProducts = FactoryXDTO . Tip(, „Produse”);

Produse = FactoryXDTO . Create(TypeXDTOProducts);
TipXDTONomenclatură= FactoryXDTO . Tip ( „http://codenotes-1c.blogspot.ru/”, „Nomenclatură” );
PaSelectionDetailedRecords. Next() Buclă
Articol = FactoryXDTO . Crea ( TipXDTONomenclatură);
Nomenclatură. Cod =SelectionDetailedRecords. Cod ;
Nomenclatură. Nume =SelectionDetailedRecords. Nume ;
Nomenclatură. Preț =SelectionDetailedRecords. Preț ;
Nomenclatură. Restul =SelectionDetailedRecords. restul ;
Bunuri . Nomenclatură. Adaugă (Nomenclatură);
EndCycle ;

Întoarcere bunuri ;

EndFunction

Pentru a demonstra funcționarea fațetelor, nu este necesar să se uite la codul în sine, acum este important să se verifice că, fără a codifica restricțiile asupra parametrilor de intrare, acestea sunt prezente datorită fațetelor.
Pentru a face acest lucru, numim operația ws cu diverși parametri:

  • fara parametri. Pentru a fi precis, vom indica codul „000000000”, prețul de la =0, ​​prețul la = 0. Deoarece parametrii goli sunt inacceptabili.

Ei bine, vom indica acest tip pentru parametrul „Cod” al operațiunii ws „Rămâne”. După care vom putea indica codul articolului atât ca număr, cât și ca șir. Fără a modifica codul, putem specifica doar 0, care corespunde unei valori de parametru goale, iar selecția nu va fi instalată.

Și asta e mișto. La urma urmei, dacă putem face restricții asupra datelor de intrare în cod, fără a folosi fațete, atunci tip compozit datele nu se pot face astfel. Acest lucru oferă oportunități ample atunci când dezvoltați servicii web.

În continuare, pentru referință, voi da valoarea fiecărui câmp de proprietate. Această descriere preluat de pe link: La ce se referă conceptul de „Facet” în cadrul modelului XDTO? Ce este o fațetă? Multumesc mult autorilor!

  • Tip de bază - un tip care este utilizat ca bază. Implicit este anyType. Setul permis de fațete depinde de această valoare.
  • Lungime - lungime fațetă. Conține numărul de unități de lungime, unitatea de lungime având semnificații diferite pentru diferite tipuri. Pentru tipurile „șir” și „anyURI”, lungimea conține numărul de caractere. Pentru tipurile „hexBinary” și „base64Binary”, lungimea conține numărul de octeți de date binare. Pentru tipurile definite de listă, lungimea conține numărul de elemente ale listei;
  • MaxInclusive—fațeta maximă care include granița. Limitează spațiul valoric de acest tip valoare maximă. Orice valoare de acest tip este mai mică sau egală cu valoarea specificată;
  • MaxLength—fațetă de lungime maximă. Conține suma maxima unități de lungime, unitatea de lungime având semnificații diferite pentru diferite tipuri. Pentru tipul „șir” lungime maxima conţine numărul maxim de caractere. Pentru tipurile „hexBinary” și „base64Binary”, lungimea maximă conține numărul maxim de octeți de date binare. Pentru tipurile definite de listă, lungimea maximă conține numărul maxim de elemente de listă;
  • MaxExclusive este o fațetă maximă care nu include o limită. Limitează spațiul valoric al unui tip dat la valoarea sa maximă. Orice valoare de acest tip este mai mică decât valoarea specificată;
  • MinInclusive - fața minimului care include granița. Limitează spațiul valoric al unui anumit tip la valoarea minimă. Orice valoare de acest tip este mai mare sau egală cu valoarea specificată;
  • MinLength—fațetă de lungime minimă. Conține un număr minim de unități de lungime, cu o unitate de lungime având semnificații diferite pentru diferite tipuri. Pentru tipul „șir”, lungimea minimă conține numărul minim de caractere. Pentru tipurile „hexBinary” și „base64Binary”, lungimea minimă conține numărul minim de octeți de date binare. Pentru tipurile definite de listă, lungimea minimă conține numărul minim de elemente de listă;
  • MinExclusive—o fațetă a unui minim care nu include o limită. Limitează spațiul valoric al unui anumit tip la o valoare minimă. Orice valoare de acest tip este mai mare decât valoarea specificată;
  • Enumerarea este o fațetă de enumerare. Definește un set valori acceptabile de acest tip;
  • Spațiu albCaractere - fațetă caractere cu spații albe. Poate lua una dintre cele trei valori:
    • Salvare - șirul poate conține orice caractere de spațiu alb;
    • Înlocuiește - linia nu trebuie să conțină #x9 (filă), #xA (line feed) și #xD (retur car). Dacă există, ele trebuie înlocuite cu caracterul #x20 (spațiu);
    • Restrângere—Pe lângă cerințele specificate pentru valoarea de înlocuire, șirul nu trebuie să conțină caractere #x20 (spațiu) pereche sau caractere #x20 (spațiu) de început sau de sfârșit;
  • DigitsTotal - fața numărului total de cifre. Conține numărul total de cifre ale unui număr (parte întreagă plus parte fracțională);
  • FractionalPartDigits - fața numărului de cifre ale părții fracționale. Conține numărul de cifre ale părții fracționale a numărului.

Experți de renume mondial în domeniul uzabilitatii și UX. La fiecare câțiva ani, ei sondajează performanța căutării pe site-urile de comerț electronic și distribuie rezultatele pe blogul lor. Ultimul studiu a fost realizat în 2017. În special pentru tine, am citit articolul cu descrierea lui, l-am tradus și am formulat concluzii practice care te vor ajuta să îmbunătățești căutarea pe propriul site.

Algoritmi de căutare

Acceptă „ghilimele” operatorului de căutare avansată

NNGroup scrie că majoritatea vizitatorilor magazinelor online nu știu să folosească operatorii de căutare avansată. Dacă doresc să găsească o jucărie pentru pisici, nu vor căuta „pisica ȘI jucărie” pentru a vedea toate produsele care au ambele cuvinte cheie în descriere. Prin urmare, nu este necesar să se sprijine astfel de interogări de căutare complexe.

Ghilimelele sunt singura excepție. Dacă includeți o expresie între ghilimele, căutarea se va baza pe o potrivire completă cu expresia. Acest operator este utilizat în cautare Google, și este larg cunoscut printre utilizatorii avansați de Internet.

Sortați automat rezultatele căutării în funcție de gradul de potrivire cu interogarea dvs

ÎN rezultatele cautarii Acele produse care satisfac toate sau majoritatea cuvintelor cheie de interogare ar trebui să fie vizibile mai întâi.

Exemplu.În studiile anterioare, utilizatorii site-ului The Container Store s-au plâns de rezultatele căutării inexacte pe site. Un utilizator a dorit să cumpere un set de recipiente de depozitare din oțel inoxidabil cu un capac transparent. După ce a cerut „recipient de sticlă din oțel”, a primit perii de toaletă și borcane de sticlă. Utilizatorul a trebuit să reformuleze interogarea de căutare de mai multe ori, dar fără succes.

Problemă motor de căutare pe site a fost că rezultatele căutării au afișat toate produsele care se potriveau cu cel puțin un cuvânt de căutare („oțel”, „sticlă” sau „recipient”), nesortate după gradul de potrivire cu solicitarea inițială. Produs care se potrivește cu toate trei Cuvinte cheie, ar putea fi oriunde în listă, nu neapărat la început. Ulterior, site-ul a actualizat algoritmul de căutare: acum, la începutul rezultatelor căutării, a fost posibil să se vadă produse care se potrivesc cu toate sau majoritatea cuvintelor cheie ale interogării.

Rezultate îmbunătățite ale căutării pe containerstore.com: primul rezultat pentru recipient din oțel și sticlă se potrivește nevoilor utilizatorului

Când sortați rezultatele după evaluarea produsului, luați în considerare valoarea ponderată a acestuia, nu media.

Prin sortarea produselor după evaluarea medie a clienților, utilizatorii nu vor să vadă produse cu o singură evaluare, chiar dacă este de 5 stele. Oamenii nu doresc să dau peste o recenzie personalizată, iar evaluarea medie a unui produs bazată pe câteva recenzii îi face să fie suspicioși. Când este sortat după evaluare ponderată, un produs cu o evaluare medie de 4,9 din 5 și 342 de recenzii va fi clasat mai sus decât un produs cu o evaluare medie de 5 din 5 și 3 recenzii. În acest fel, utilizatorul își va putea face o idee obiectivă despre popularitatea și calitatea produsului.

Designul și poziția barei de căutare

Afișați bara de căutare într-un singur bloc cu meniul de navigare în antetul site-ului

Această aranjare a barei de căutare se găsește pe multe site-uri, astfel încât utilizatorii știu deja unde să caute pentru a o găsi. În plus, afișarea șirului de căutare într-un singur bloc cu meniu de navigatie rezolvă multe probleme, de exemplu, cu absența ei pe unele pagini ale site-ului și necesitatea de a o repeta suplimentar pe pagina cu rezultatele căutării.

Pe site-ul Wildberries este mare și clar vizibil șir de căutare situat chiar în antetul site-ului

Afișați o bară de căutare și o pictogramă lupă pe ecran

Când vizitatorii site-urilor de cumpărături online doresc să folosească căutarea, ei caută un câmp larg gol sau o pictogramă lupă. În același timp, nu mai este necesar să semnați în mod explicit șirul de căutare și să îl numiți „Căutare”, deși nu va strica.

Multe site-uri în versiuni pentru smartphone-uri folosesc cu succes pictograma lupă și nu arată linia în sine, ceea ce le permite să economisească spațiu pe ecran. Dar dacă vânzările site-ului dvs. depind de căutare, este mai bine să afișați imediat bara de căutare, chiar și pe ecrane mici. Acest lucru este valabil mai ales pentru versiunile pentru PC ale site-urilor web, unde există mai mult decât suficient spațiu pe ecran. Utilizați un câmp gol cu ​​un buton „Găsiți” sau o pictogramă lupă. Câmpul ar trebui să fie vizibil pe fiecare pagină.

Restrângeți rezultatele căutării

Nu utilizați căutarea avansată sau căutarea pe categorii decât dacă sunteți Amazon

În trecut, multe magazine online foloseau funcții avansate de căutare și de căutare pe categorii pentru a ajuta utilizatorii să restrângă numărul de articole din rezultatele căutării lor. Cu toate acestea, oamenii nu prea folosesc căutarea avansată și adesea se încurcă atunci când caută pe categorii, așa că aceste caracteristici au demodat treptat.

Astfel de metode avansate de căutare sunt acum disponibile doar pe acele site-uri unde sunt cu adevărat utile. Acestea sunt fie site-uri cu scenarii de căutare speciale, cum ar fi eBay, fie magazine online cu o sumă imensă produse precum Amazon și Wal-Mart.

În alte cazuri, este mai bine să utilizați căutarea fațetă. Diferența sa cheie față de căutarea categoriei este că utilizatorii restrâng selecția de produse DUPĂ ce au primit rezultate prin interogare de căutare, nu inainte.

Utilizați căutarea fațetă

Căutarea cu fațete permite utilizatorilor să își restrângă rezultatele căutării folosind filtre bazate pe atributele produselor pe care utilizatorii le vizualizează. Dacă anterior căutarea fațetă era un plus frumos pentru un magazin online, acum utilizatorii sunt atât de obișnuiți cu ea încât o caută pe site și își exprimă nemulțumirea dacă nu există. În zilele noastre, site-urile de comerț electronic fără căutare fațetă sunt mai degrabă excepția decât regula.

Căutare fațetă pe site-ul magazinului online Utkonos: filtrele din stânga vă permit să restrângeți rezultatele

Completare automată în bara de căutare

Suportă funcția de completare automată

Caracteristica de completare automată este că, pe măsură ce utilizatorul introduce un cuvânt în bara de căutare, vede interogările recomandate într-o listă derulantă. Dacă o solicitare din listă se potrivește utilizatorului, atunci acest lucru îl economisește timp și, de asemenea, ajută la evitarea greșelilor de scriere și a altor erori.

Funcția de completare automată a fost prezentă pe majoritatea site-urilor studiate de NNGroup. În același timp, studiul a arătat că utilizatorii au ales opțiuni din lista celor propuse nu atât de des - în doar 23% din cazuri. De obicei, ei vor continua să tasteze interogarea lor.

Cu toate acestea, completarea automată este utilă. Chiar dacă utilizatorii nu selectează o opțiune din listă, ei pot vedea și înțelege ce produse sunt disponibile pe site și ce caută alți cumpărători.

Acceptă completarea automată avansată

Căutările de completare automată care conțin produse recomandate, fotografii și alt conținut pe lângă lista de interogări sunt o tendință care câștigă popularitate pe unele site-uri e-com. A apărut în urmă cu aproximativ cinci ani, dar a dispărut rapid, iar acum s-a întors formă nouă, care amintește de un megameniu - un câmp drop-down cu opțiuni de interogare recomandate ocupă destul de mult spațiu pe ecran.

Căutați cu completare automată avansată în magazinul online Labyrinth

Cercetarea NNGroup a arătat că această caracteristică funcționează cel mai bine pe site-uri cu o varietate de categorii de produse sau produse care sunt vizual foarte diferite unele de altele.

Probleme de căutare de bază

Probleme cheie care îngreunează căutarea pe site:

  • funcție de căutare discretă: de exemplu, ascunsă în spatele unei mici pictograme lupă aprinsă ecran mare sau în meniul de hamburgeri versiune mobila site-ul web;
  • un șir de căutare insuficient de „inteligent” care nu poate procesa greșelile de scriere, erorile sau sinonimele pentru cuvintele cheie de interogare;
  • afișare non-standard a rezultatelor (comutație între pagini, sortare, filtrare);
  • filtre prost gândite (atribute irelevante, funcționalitate slabă, rezultate goale).

Cum poate ajuta USABILITYLAB să îmbunătățească căutarea pe site-ul magazinului dvs. online

Aceasta încheie analiza noastră a articolului NNGroup. Sperăm că ți-a fost de folos.

Dacă doriți să evaluați sau să îmbunătățiți căutarea pe site-ul dvs., vă rugăm să ne contactați. O vom duce la îndeplinire. Pentru testarea gradului de utilizare, vom implica reprezentanți ai dvs public țintă. Ei vor lucra pe site-ul dvs. sub supravegherea expertului nostru. Laboratorul nostru este echipat cu o oglindă unidirecțională, astfel încât să puteți fi prezent și în timpul testării și să vedeți tot ceea ce fac respondenții. Pe baza rezultatelor testării, vom trage concluzii despre cât de bine răspund căutarea de pe site-ul dvs. nevoilor utilizatorilor și vom formula recomandări pentru îmbunătățirea acesteia, pe care le puteți transmite dezvoltatorilor dvs.

Pentru a afla mai multe despre serviciile noastre, lăsați o solicitare pe site-ul nostru web sau scrieți lui Dmitry Silaev: