Newsgroup: it.comp.www.php
Titolo: Ricerca avanzata

Vorrei dare la possibilità al motore di ricerca di non cercare solo una
singola parola o una singola frase come faccio adesso con:
$result = mysql_query("select lid, title,description  from links  where
(title LIKE '%query%') ORDER BY asc LIMIT 10,$linksresults");
In questo modo se cerco la parola "codice php" mi trova solo i link che
hanno nel titolo o nella descrizione la frase esatta "codice php" e mi salta
quelli con scritto "codice per il php".
Oppure se cerco "Codice php" vorrei che mi trovi i link che hanno nel titolo
una qualsiasi della due parole.
Allora l'ho modificato così:
$result = mysql_query("select lid, title,description  from links  where
(title $like) ORDER BY asc LIMIT 10,$linksresults");
... praticamente dentro $like, se cerco "Codice php", dovrebbe esserci:
 title  LIKE '%codice%' OR title LIKE '%php%'  OR description LIKE
'%codice%' OR description LIKE '%php%'
Allora ho scritto questo tenendo conto che dalla form le parole cercate
vengono memorizzate dentro $query e con un option scelgo se cercare tutte le
parole o solo una mettendo $query_avanzata uguale a 1 (per OR) o uguale a 2
(per AND):
$query3=$query;
$descr[0]="title";
$descr[1]="description";
$num_descr=count($descr);
$delta=0;
if($query_avanzata){
while($num_descr>$delta){
                     if ($gamma==1) {
                     $query2=explode(" ",$query3);
                     $count=count($query2);
                     $c=0;
                     while ($c<$count){
                           if($a>0) $like=$like." OR $descr[$delta]";
                           $a++;
                           $like=$like." LIKE '%$query2[$c]%'";
                           $c++;
                           }
                        $delta++;
                     }
                     if ($gamma==2){
                     $query2=explode(" ",$query3);
                     $count=count($query2);
                     $c=0;
                     while ($c<$count){
                           if($a>0) $like=$like." AND $descr[$delta]";
                           $a++;
                           $like=$like." LIKE '%$query2[$c]%'";
                           $c++;
                           }
                        $delta++;
                     }
                    }
     }
Il problema è che dopo quando metto:
$result = mysql_query("select lid, title,description  from links  where
(title $like) ORDER BY asc LIMIT 10,$linksresults");
non mi trova mai una mazza.....
ciao
Mirko

ops era cosě  scusate (non funziona lo stesso ma prima avevo messo un $gamma
che non c'entrava piů niente):
$query3=$query;
$descr[0]="title";
$descr[1]="description";
$num_descr=count($descr);
$delta=0;
if($query_avanzata){
while($num_descr>$delta){
                     if ($query_avanzata==1) {
                     $query2=explode(" ",$query3);
                     $count=count($query2);
                     $c=0;
                     while ($c<$count){
                           if($a>0) $like=$like." OR $descr[$delta]";
                           $a++;
                           $like=$like." LIKE '%$query2[$c]%'";
                           $c++;
                           }
                        $delta++;
                     }
                     if ($query_avanzata==2){


Non leggo tutto il codice, scusa.
Ma se non ti dà risultati (ovverosia il recordset è vuoto),
verosimilmente c'è un piccolo refuso nella query. Metti un echo e vedi
un po' la stringa della query SQL come viene fuori.
Comunque, a prima vista, il codice mi sembra un po' lungo... quando in
sostanza i passaggi da fare (non sto a implementarli) mi sembrano:
- explode() della stringa di ricerca immessa dall'utente usando gli
spazi " " come demarcatori
- la prima parte della query sarà 
   "SELECT xx FROM tuatabella 
     WHERE title LIKE '%".$query[0]."% 
     OR description LIKE '%".$query[0]."%"
- ora, per ogni ulteriore elemento dell'array $query, aggiungi alla
query 
" OR title LIKE '%".$query[n]."% OR description LIKE '%".$QUERY[N]."%"
- concludi la query accodando i vari ORDER BY LIMIT ecc.
Se poi vuoi, nella marschera di ricerca chiedi all'utente di
selezionare un radiobutton tipo "almeno una parola / tutte le parole /
frase esatta".
Nel secondo caso, usi AND invece di OR (ovviamente, però, non puoi
eseguire questa ricerca su due campi!). Nel terzo, fai la ricerca sul
puro testo dell'utente.

 non mi trova mai una mazza.....
Non sto a guardare tutto questo, solo due consigli:
Per vedere la query che stai veramente a fare la assegni ad una variabile e
la stampi a video:
  $query = "select lid, title,description  from links  where (title $like)
ORDER BY asc LIMIT 10,$linksresults");
echo $query;
Poi fai la query e aggiungi un check su eventuali errori
  $result=mysql_query($query) or die (mysql_error());
magari vedi l'errore poi subito...
:)

 > Il problema è che dopo quando metto:



Dipende molto da come sono questi LIKE, se sono con AND la cosa e molto
efficiente e non hai problemi con un limite (basta che fallisce uno e mySQL
avvanza con il puntatore sulla tabella). Quando usi OR la cosa diventa
critica (perche' mySQL deve magari salvare molti dati temporanei).
Usa sempre dei Indici, quelli sono fondamentale per la velocita' di una
query!
Altra cosa per ottimizzare e' di mettere i LIKE meno probabili all'inizio
della WHERE, esempio WHERE CAP='50102' AND ETA=20 e non viceversa.
Saluti
Jurgen
P.S.: Quota prima, poi metti la tua risposta o domanda.


Perň il tipo di parole le sceglie chi fa la ricerca quindi in questo caso
non potrei decidere quale puň essere piů probabile o meno.
ciao
Mirko

query!
A questo punto avrei una domanda tecnica: gli indici sono ugualmentte
efficienti nell'uso di LIKE? 
Intendo: se indicizzo ad es. un campo tipo "cognome" e cerco "Rossi"
certo l'indice velocizza il tutto. 
Ma l'indice indicizza il contenuto di un campo gestendolo come una
stringa intera, oppure indicizza le singole parole? 
Nel primo caso, che mi sembra il più probabile, se indicizzo "Nel
mezzo del cammin di nostra vita" e poi cerco LIKE '%nostra%' l'indice
non entra molto in gioco...
E ancora: indicizzare un campo blob ha senso?
M

 non potrei decidere quale puň essere piů probabile o meno.
Dipende, se osservi motori di ricerca scartano parole che sono troppo
frequente, quasi redundante (in italiano potrebbe essere: la il lo i e
ecc.).

 wrote in message
news:53225uceq8g2th23p...@4ax.com...

Solo i LIKE "parola%" sono efficiente.
LIKE "%parola%" ovviamente non piu'...
ma puoi creare un indice Fulltext (vedi su manuale mySQL 6.9 MySQL Full-text
Search) su campi TEXT.
BLOB non viene indicizzato (mySQL non te lo permette neanche, ti da' un
errore).
AFAIK, nel caso in cui devi indicizzare BLOB si creano nuove tabelle
(secondarie diciamo) che contengono le singole parole (l'applicativo pensa a
questo, non piu' mySQL). Quindi per ogni parola nei testi sai quale testo la
contiene, magari con un peso per la frequenza e posizione. Diventa un
database enorme ma cosi si trova molto prima.


Avevo già calcolato di scartare gli articoli e le preposizioni, però i LIKE
meno probabili penso potrei farlo solo con le seguenze di numeri tipo i CAP,
i numeri di telefono ecc.....come hai messo tu......oppure ci sono anche
altre soluzioni?
ciao
Mirko