Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[MySQL] usare SELECT e MATCH con wildcards

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

[MySQL] usare SELECT e MATCH con wildcards

Postdi Dylan666 » 09/04/07 22:53

La situazione è questa: mi trovo a catalogare varie immagini in base al nome del file, al titolo dell'opera, all'autore, alla data di creazione e alle parole chiave che hanno attinenza con le cose raffigurate.

Sto riempiendo quindi un database MySQL fomato da una sola tabella e sei colonne:

  • Nome
  • Titolo
  • Autore
  • Data
  • Parole chiave


Sto creando un mini-motore di ricerca in base a queste sei categorie utilizzando dei form HTML e del PHP. Per i primi 4 campi non c'è problema, utilizzo formule del tipo:

SELECT * FROM nome_tabella WHERE `autore` LIKE ('%dylan%')

Così facendo trovo sia le opere di dylan666 che di Redylantes dato che ho usato la doppia percentuale che sarebbe la wildcard

Per il sesto campo, dove dovrei cercare varie parole o parti di esse in un elenco ho trovato questa pagina del manuale di MySQL:
http://dev.mysql.com/doc/refman/5.0/en/ ... olean.html

Mi pare sia un metodo di ricerca adattissimo a quello che voglio fare io. Noto però in quel caso che se volessi usare le wildcard devo usare l'asterisco e posso utilizzarlo solo dopo la parola da cercare:

SELECT * FROM nome_tabella WHERE MATCH (keywords) AGAINST ('cane*' IN BOOLEAN MODE)

In questo modo trovo opere legate alla parola canestro ma non pescecane.

C'è un modo per risolvere il problema? Che vantaggi ho nell'usare la ricerca boleana dovendo rinunciare alla doppia wildcard rispetto al SELECT classico? Ne ho in termini di velocità ad esempio?
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Sponsor
 

Re: [MySQL] usare SELECT e MATCH con wildcards

Postdi archimede » 10/04/07 08:25

Dylan666 ha scritto:Che vantaggi ho nell'usare la ricerca boleana dovendo rinunciare alla doppia wildcard rispetto al SELECT classico?
Per fare una ricerca che supporti i vari operatori (+, -, ", ecc.) dovresti fare un bell'esercizio di manipolazione delle stringhe.
Dylan666 ha scritto:Ne ho in termini di velocità ad esempio?
Se ci costruisci sopra un indice (come spiegato nel link) quasi sicuramente credo.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi Dylan666 » 10/04/07 17:39

l'aggiungere gli operatori alle stringhe non è un problema. Ho letto circa i vantaggi che ci sono nella velocità della ricerca full-text e del fatto che i record trovati vengono automaticamente ordinati in base pertinenza calcolata con un coefficiente...
http://www.webmasterpoint.org/mysql/09- ... -mysql.asp


...ma l'uso di una solo wildcard e solo in "append" è un bell'handicap.
Ho notato infatti che il Cerca di questo forum ad esempio (suppongo anche per la limitazione appena citata) usa le SELECT:

Codice: Seleziona tutto
                  if ( !empty($search_terms) )
                  {
                     $current_match_type = 'and';
                  }

                  if ( !strstr($multibyte_charset, $lang['ENCODING']) )
                  {
                     $match_word = str_replace('*', '%', $split_search[$i]);
                     $sql = "SELECT m.post_id
                        FROM " . SEARCH_WORD_TABLE . " w, " . SEARCH_MATCH_TABLE . " m
                        WHERE w.word_text LIKE '$match_word'
                           AND m.word_id = w.word_id
                           AND w.word_common <> 1
                           $search_msg_only";
                  }
                  else
                  {
                     $match_word =  addslashes('%' . str_replace('*', '', $split_search[$i]) . '%');
                     $search_msg_only = ( $search_fields ) ? "OR post_subject LIKE '$match_word'" : '';
                     $sql = "SELECT post_id
                        FROM " . POSTS_TEXT_TABLE . "
                        WHERE post_text LIKE '$match_word'
                        $search_msg_only";


Che ne pensi?
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi archimede » 10/04/07 17:52

Dylan666 ha scritto:l'aggiungere gli operatori alle stringhe non è un problema.
<snip>
Che ne pensi?
La prima frase non l'ho capita. Per il resto che posso dire? Mi paiono due strumenti diversi: dipende da cosa devi fare immagino. Se i tuoi utenti si "accontentano" della ricerca classica, probabilmente con il LIKE ti sbatti di meno. Se si aspettano una ricerca stile Google, con l'SQL "standard" la vedo dura.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi tekanet » 11/04/07 09:38

Idea malsana: potresti aggiungerti una in più in cui salvi "invertito" il contenuto della colonna keywords. La query mi pare si possa estendere anche a più colonne, tipo:

WHERE MATCH (keywords, sdrowyek)

Se cerchi cane* nella keywords, cerchi poi enac* nella seconda, che così ti da le righe che contengo la keyword che termina per cane..

Metto le mani avanti, non ho proprio pensato alla reale fattibilità della cosa, ma magari è una strada che puoi percorrere.

tK
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi Dylan666 » 11/04/07 13:30

Se metti le lettere invertite il motore di ricerca le cerca in quell'ordine, quindi non trova nulla ;)
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi tekanet » 11/04/07 14:03

Ovviamente andrebbe invertito anche il testo della ricerca..
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest

Postdi Dylan666 » 11/04/07 20:46

No guarda, se ci pensi bene non funziona ;)
Se nel database ho la parola windowsxp e voglio che si possa trovare anche cercando *xp ma non posso usare l'esterisco all'inizio, non sarà certo metternod px* che la troverò, a meno di non abbia già immesso tutte le voci del database scritte sia in avanti che all'indietro e pretendendo che gli utenti cerchino così ;)
E mi parrebbe bizzaro, poco professionale e poco funzionale ;)
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi tekanet » 12/04/07 08:57

Si, intendevo questo. Basterebbe aggiungere una colonna in più, con le keywords invertite; farsi una funzione che reversa una stringa (è piuttosto facile). All'insert, inserire sia le keys "straight" che le "reversed" (l'utente scrive le giuste, la funzione apposita fa il reversing. All'atto della ricerca, la stringa di ricerca va passata anch'essa alla funzione, con qualche smanettamento degli *.

IMVVVVHO, si può provare :). Se le keywords e le "sdrowyek" sono sullo stesso record, potrebbe andare.

Ma non insisto oltre, mi sa che non ti piace come soluzione :P!

Ciao!
tekanet
Utente Senior
 
Post: 173
Iscritto il: 03/09/02 10:22
Località: Milano sud-ovest


Torna a Programmazione


Topic correlati a "[MySQL] usare SELECT e MATCH con wildcards":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti