PDA

View Full Version : [php]Problema con ricerca record in mysql


leonapster
21-02-2008, 14:46
Ciao,

sto facendo un piccolo motore di ricerca di trame di film. Il mio problema è nell'esecuzione della quey

SELECT * FROM film WHERE name LIKE '%$film_name%' ;

Nel db, per esempio, ho questo film: "Caos Calmo".

Se qualcuno cerca "Calmocaos" o "Calmo Caos" o "Caos-calmo" ecc... non trova il record.

Come fare per ovviare?
In alternativa conoscete script per realizzare motori di ricerca?

Avevo pensato al Zend Framework. Fatemi sapere cosa ne pensate?



grazie

_fefe_
22-02-2008, 15:19
Ciao,

sto facendo un piccolo motore di ricerca di trame di film. Il mio problema è nell'esecuzione della quey

SELECT * FROM film WHERE name LIKE '%$film_name%' ;

Nel db, per esempio, ho questo film: "Caos Calmo".

Se qualcuno cerca "Calmocaos" o "Calmo Caos" o "Caos-calmo" ecc... non trova il record.

Come fare per ovviare?
In alternativa conoscete script per realizzare motori di ricerca?

Avevo pensato al Zend Framework. Fatemi sapere cosa ne pensate?



grazie

ciao,
secondo me dovresti prima sostituire caratteri i strani (tipo -, _, /, \) con uno spazio e poi fare un explode su $film_name e poi inserire le singole parole in AND.
qualcosa del tipo:

$film_name=str_ireplace("-", " ", $film_name);
$temp=explode(" ", $film_name);
$query="SELECT * FROM film WHERE name LIKE '%".$temp[0]."%' AND name LIKE '%".$temp[1]."%'";

magari metti la scrittura della query all'interno di un for per poter aggiungere tutte le parole.

Questo però non risolve il primo esempio che hai detto tu (Calmocaos). Quì il problema stà nell'individuare le parole che compongono il titolo e trovare una soluzione potrebbe non essere conveniente in termini computazionali :mc:
Puoi provare a cercare nella query ogni singola lettera (quindi explode diventa inutile):

...name LIKE '%".$film_name[0]."%' AND name LIKE '%".$film_name[1]."%' AND...

usa strlen per determinare la lunghezza complessiva della stringa

leonapster
22-02-2008, 18:11
Bè credo che la via più semplice sia con il FULL TEXT, anche perchè poi mi ordina i risultati per attinenza

Comunque ho provato ad eseguire questa query:

SELECT * FROM data WHERE MATCH (name) AGAINST ('Die*');

Nel db ho "Die Hard 4".

Invece non mi ritorna nulla di nulla.

gugoXX
22-02-2008, 18:28
Il Full text e' la strada giusta per il motore di ricerca.
Prova senza l'asterisco

leonapster
23-02-2008, 14:26
Il Full text e' la strada giusta per il motore di ricerca.
Prova senza l'asterisco

Neppure senza l'asterisco funziona....

_fefe_
25-02-2008, 10:26
che db usi?
se usi mySQL ci sono delle limitazioni per usare il full text (versione di mySQL, tipo di tabelle ecc.).
prova a vedere cosa dice quì (http://www.risorse.net/mysql/query_full_text.asp)