PHP/MySQL pretraga i odredjeni prikaz rezultata

Pozdrav svima. Proredilo se pitanja php/mysql isl, pa da potegnem jedno pitanje, ako ne smeta.
Na jednom sajtu treba da resim pretragu tako da bude nesto bolja.
Trenutno kako radi pretraga: ako se ukucaju dve ili vise reci, pretraga ce izbaciti rezultat ako naziv ima obe ili vise ukucane reci u naslovu ili opisu.
Sada treba resiti ovako: najpre prikazati upise koje imaju sve upisane reci koje se traze (npr 3 reci), onda ispod toga upise koji sadrze dve reci od upisanih, a onda na kraju upise koji sadrze samo jednu rec.
Takodje, vrlo bitno, ako neko trazi televizore, ali pogresi i ukuca “relevizor” ili samo “releviz” pretraga pomocu neke funkcije (ako nije mysql funkcija SOUND LIKE, ne znam koja druga) treba da prikaze televizore.
SOUNDS LIKE sam probao, ali pretrezuje samo ako u koloni tabele ima samo jedne reci, npr “televizor”, ako ima jedne recenice u naslovu ili citavog teksta u opisu, to ne funkcionise.
Jel ima neko neku ideju, tj smernice za gore dva navedena primera, a sam cu posle resavati? Nemam predstavu odakle krenuti. Za ono prvo mi se motljaja po glavi da resavam preko php, da pretrazujem svaku od otkucanih reci u tekstu i naslovu i da nesto brojim, pa da pravim neke nizove s odredjenim redosledom, pa da na kraju opet kreiram neki upit koji ce da izlista upise po predvidjenom redosledu iz kreiranog niza, ali mi se cini da cu ga zakomplikovati.

Evo da javim da sam resio, na iznandjenje brzo, uz pomoc php funkcije “similar_text”. Preko nizova hvatao i sortirao od upisa s najvise pronadjenih ukucanih reci, pa do upisa sa jednom pronadjenoj reci u tekstu/naslovu.

Prouči i levenshtein. Puno jeftiniji od similar_text mada i dalje skup za korištenje.

Baš sinoć sam naleteo na tu funkciju, danas nešto isprobavao, ali mi se za sada nešto ne uklapa, ili je nisam isprobao na pravi način.
Hvala na odgovoru!

1 Like

Zbog ovog sam rek’o

(vezano za levenshtein)

The complexity of the algorithm is O(m*n) , where n and m are the length of string1 and string2 (rather good when compared to similar_text(), which is O(max(n,m)**3) , but still expensive).

Ako itko zna, to je kolega @tpojka . Nego, mene zanima, što znači skupo? Jeli to neki modul koji se plaća ili što?

Mislim da se to da izvesti kroz php + regex, da se prema bazi pošalje više upita i da se uhvati više rezultata?

Nisam jedini al’ mogu da pogledam. :smiley:

Znači kol’ko je kompleksan (skup) algoritam u izvodjenju tj. kol’ko će zauzeti resurse servera (procesorsku snagu i memoriju).

Iz pasusa gore se vidi da ako su stringovi koji se uporedjuju recimo 2 i 3 karaktera dužine, levenshtein algo complex je 6, a similar_text 27.

Sad apstrahuj dopunjenu bazu, dužine stringova, i eto veselja.

similar_text za sada ne opterecuje bazu, odnosno ne usporava sajt, ima podosta proizvoda, pretrazuje kategorije i blog tekstove.
I levenshtein i similar text imaju problem sa utf8. Ako npr neko kuca u pretrazi “macka” a u textu se nalazi “mačka” nece da pronadje, slaganje ide ispod 80.

Vidi i ovde kako su uradili.

1 Like