[ Jorgovan88 @ 23.10.2014. 00:25 ] @
Da li bi neko mogao da mi objasni kako da napravim lepsu pretragu na sajtu... Trenutno mi ova linija obavlja tu funkciju medjutim nisam zadovoljan

Code:
mysql_query("SELECT * FROM articles WHERE title LIKE '%".$query."%' ORDER BY id DESC LIMIT 50");


Znaci ovaj kod vraca 50 stvari iz baze ali meni trebaju drugaciji rezultati... za primer uzecemo ovaj naslov

Citat:
Kako napraviti malo lepsu pretragu?



Ukoliko je kljucna rec "Kako napraviti" onda ce ova tema izaci u pretrazi ali ako je kljucna rec "Kako napraviti pretragu" onda se nece pojaviti.... Hocu da kazem da bi trebao mozda neki explode da radim pa da pretrazujem valjda...
treba valjda da brojim koliko ima reci i onda da pretrazim za prvu rec pa od tih rezultata pretrazujem drgu i tako ce biti sve manje i manje rezultata i na kraju dobijemo konacni rezultat...

tnx

[Ovu poruku je menjao Jorgovan88 dana 23.10.2014. u 01:40 GMT+1]
[ Cola @ 23.10.2014. 07:08 ] @
ovako nekako
Code:

            $where = "";
            $queries = explode (" ", $query);
            foreach ($queries as $value)
            {                
                if($where != "")
                {
                    $where .= " OR \n";
                }
                $where .= " title LIKE '%" . $value . "%' ";
            }
            if($where != "")
            {
                $where = " WHERE \n" . $where;
            }
            mysql_query("SELECT * FROM articles " . $where . " ORDER BY id DESC LIMIT 50");

naravno ovde nisam obraćao pažnju na SQL injection
[ Cola @ 23.10.2014. 07:27 ] @
PS
da bi ovo bolje radilo moraš napraviti i drugačije rangiranje.
Zašto?
Npr:
"Kako napraviti dobru a lijepu pretragu"
Ovo slovo "a" će vratiti sve naslove koji u sebi sadrže to slovo. Možeš da izbacuješ riječi npr koje su kraće od 3 karaktera ili da formiraš neki
rejting koji bildaš zajedno sa wherom u foreach petlji
Code:

                $rating .= "\n+CASE";
                $rating .= "\n    WHEN title LIKE '" . $value . "%' THEN 1000"; //Poeni ako naslov počinje sa
                $rating .= "\n    WHEN title LIKE '% " . $value . "%' THEN 950"; //Poeni ako naslov sadrži term sa spejsom ispred
                $rating .= "\n    WHEN title LIKE '%." . $value . "%' THEN 900"; //Poeni ako naslov sadrži term sa tačkom ispred
                $rating .= "\n    WHEN title LIKE '%?" . $value . "%' THEN 900"; //Poeni ako naslov sadrži term sa upitnikom ispred
                $rating .= "\n    WHEN title LIKE '%!" . $value . "%' THEN 900"; //Poeni ako naslov sadrži term sa uskličnikom ispred                
                $rating .= "\n    WHEN title LIKE '%," . $value . "%' THEN 900"; //Poeni ako naslov term sa zarezom ispred
                $rating .= "\n    WHEN title LIKE '%-" . $value . "%' THEN 850"; //Poeni ako naslov term sa minusom ispred
                $rating .= "\n    WHEN title LIKE '%!_" . $value . "%' ESCAPE '!'  THEN 850"; //Poeni ako naslov sadrži term sa donjom crtom ispred
                $rating .= "\n    WHEN title LIKE '%" . $value . "%' THEN 510"; //Poeni ako naslov sadrži term bilo gdje u sebi
                $rating .= "\n    ELSE 0"; //bez poena
                $rating .= "\nEND * " . strlen($value); //množimo sa dužinom riječi da bi duže riječi imale više poena

i na kraju to dodamo u upit
Code:

            if($rating != "")
            {
                $rating = " ORDER BY " . $rating ;
            }
            mysql_query("SELECT * FROM articles " . $where . $rating . " LIMIT 50");
[ Nemanja Avramović @ 23.10.2014. 10:23 ] @
Koristi FULL TEXT search. Evo lepog objašnjenja: http://devzone.zend.com/26/using-mysql-full-text-searching/

I naravno, uvek korisna MySQL dokumentacija: http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

[ Nemanja_666 @ 23.10.2014. 22:53 ] @
U zadnje vrijeme koristim ovo: http://www.elasticsearch.org/
[ VladaSu @ 24.10.2014. 13:32 ] @
Ja bih dodao jos jednu tabelu slicnih fraza i reci.
Recimo ako je 'Kako napraviti pretragu' mozda neko kuca 'Kako napraviti pretragE' ili 'pravljenje pretrage'.
Rezultate bih redjao po ovom redu:
'Kako napraviti pretragu',
'Kako napraviti pretrage',
'napraviti pretragu',
'napraviti pretrage',
'pravljenje pretrage'
'pretragu',
'pretrage',
'napraviti'
'pravljenje',
'praviti'.......

Znaci u napravio bih tabelu slicnih fraza i reci i sve to bih ukljucio u pretragu.
U ovom slucaju logicno je da rec pretraga ima najvecu tezinu pa napraviti pa tek onda kako.
Prvo bih trazio najdruze fraze i njene slizne fraze. pa bih onda trazio najveci moguci broj koji daje kombinacija reci sa najvecom tezinom i tako smanjivao prvo kombinaciju tezine
pa tek onda smanjivao kombinaciju duzine.
Ja sam sa ovim najvise bio zadovoljan.

Na kraju kada sve to napravis i vidis da nije idealno i da admini ne unose logicno podatke i nemaju inspiraciju onda uzmes za 5 minuta ugradis google search plugin za tvoj sajt.
[ valjan @ 24.10.2014. 19:40 ] @
Ili naučiš regularne izraze i osnove leksema, infleksija i derivacija reči, i onda umesto glomaznih tabela i algoritama sve rešiš daleko efikasnije...
[ Goran Rakić @ 24.10.2014. 20:43 ] @
Regularnim izrazima? Teško bez Tjuring kompletnosti.
[ VladaSu @ 24.10.2014. 21:00 ] @
Citat:
valjan:
Ili naučiš regularne izraze i osnove leksema, infleksija i derivacija reči, i onda umesto glomaznih tabela i algoritama sve rešiš daleko efikasnije...


Da je tako onda bi i google tako radio a to mozes jednostavnim testom da utvrdis.