-
Sorry ca nu am mai urmarit thread-ul acesta in ultimul timp.
Eu ma refer la un algoritm de cautare in cadrul unui magazin existent.
Cautarea trebuie sa fie cat mai human like ( = ca si cum ai vorbi cu un om de la magazin de la raionul X).
@B3aT: poti sa rezolvi foarte simplu cu view-uri. In view faci mai multe selecturi si recordsetul returnat catre script e unul singur in ordinea unei relative relevante. Asta este un prim pas.
In discutie aici sunt, pe de o parte, modurile de stabilire a relevantei si optimizarea ordonarii dupa relevanta.
O alta solutie ar fi sa iti definesti keywords (tags) pe fiecare produs si pe fiecare user x produs, bineinteles avand si un scoring al asocierii.
Dupa ce pui asta la punct poti sa mergi mai departe si sa implementezi suport pentru stop words, exclusion words, etc.
Si drumul nu se opreste aici :)
-
Problema relevantei inteleg cum se rezolva dar daca ai pute sami dai un exemplu cu view-uri as fi recunsocator.
Alta problema ar fi la cautarea de keyworduri longtail, nestiind bine mysql am rezolvat-o prin generarea queryului in functie de cuvinte (ex titlu = %key1% OR titlu = %key2% ). Nu stiu cat de proasta e solutia dar alta nu mia venit in minte.
-
Hai sa iti dau un exemplu clar si apoi iti fac transpunere in algoritm.
Userul face o cautare dupa "cuvant1 cuvant2".
Ce trebuie sa ai tu inainte de a face cautarea:
- un sistem in care sa tii o lista de keywords si o asociere intre keywords si produse si un scoring de asociere
Cautare se face asa:
- iei o lista de produse unde se gaseste si cuvant1 si cuvant2 | lista 1
- iei o lista de produse unde se gaseste cuvant1 | lista 2
- iei o lista de produse unde se gaseste cuvant2 | lista 3
- DACA numarul de rezultate este mai mic decat X (X il definesti tu in functie de numarul de produse din site, de specific, etc) atunci incerci sa faci o cautare dupa eventuale cuvinte scrise gresit (descriu mai jos)
- in urma cautarii rezulta lista 4
- unifici listele
- le ordonezi dupa scoring (in cazul listei 1 scoringul este suma scoringurilor pe cele 2 keyworduri)
- afisezi rezultatele
In unele cazuri, sa faci o astfel de procedura in PHP iti mananca ceva resurse deci se recomanda, numai daca este nevoie, sa folosesti proceduri storate (stored procedures) si sa muti tot ce am descris eu mai sus in SQL.
Cuvinte scrise gresit: orice cuvant are asociata logic si o lista de posibile greseli. Gasesti o groaza de documentatie pe net.
Un exemplu de modalitate de calculare a posibilelor cuvinte gresite este:
- se da cuvantul abcdef
- se considera regula de baza ca nu vom avea mai mult de 30% din litere gresite, in cazul nostru maxim 2 in acelasi timp de unde rezulta ca pentru abcdef noi putem avea 21 de variante (sper ca am calculat ok ;) )
- pt fiecare varianta faci variatii in functie de litera de replacement si aici se iau in considerare tastele adiacente.
Exemplu:
cuvant initial: abcdef
ex1: luam litera a, taste adiacente sunt qwsz deci greseli pot fi qbcdef, wbcdef si tot asa
Mai departe:
consideram ca abcdef este asociat cu produsul X cu un scoring de 100.
toate misspellurile lui abcdef vor fi asociate cu keywordul abcdef
In consecinta: atunci cand faci cautare dupa qbcdef si nu se returneaza suficiente rezultate se vor face cautari si dupa abcdef.
Te las sa digeri informatia si daca mai sunt intrebari nu ezita sa scrii aici.
Regards,