Una query per la ricerca all'interno del sito | SQL & MySQL

Topic: Pubblico - Composto da 35 Posts di 2 Utenti.

07 Dicembre, 2011 18:15 #1
rodolforizzo76
Utente

rodolforizzo76
Registrato: Dec, 2011
Posts: 47
Offline

Sto cercando di implementare un modulo per la ricerca nel sito.
Per capire in cosa consiste il problema potete andare a questa pagina:

http://www.painteronline.org/search.php

ed inserire la stringa "maurizio rizzo".
La query funziona anche se scrivi solo "maurizio" oppure soltanto "rizzo", ma se provi a scrivere "rizzo maurizio" non trova nessuna corrispondenza.

Considerate che al momento della creazione della tabella non ho abilitato la ricerca full-text.

Si può fare qualcosa?

La query utilizzata ora è la seguente:

1SELECT * FROM images, dl_user WHERE concat(dl_user.nome, ' ', dl_user.cognome) LIKE '%$stringa%' AND dl_user.username = images.image_username

Saluti

Rodolfo Rizzo.


Beh, eh... no, non esattamente. È... ah, è molto complicato come caso. Un mucchio di input e output. Una quantità di informazioni, e un mucchio di elementi da considerare. Ho una quantità di elementi da tenere presente. Fortunatamente io rispetto un regime di droghe piuttosto rigido per mantenere la mente, diciamo, flessibile...
-- The big Lebowski --

07 Dicembre, 2011 19:14 #2
re-verse
Moderatore

re-verse
Registrato: Jul, 2008
Posts: 312
Offline

Ciao,
a prima vista posso dirti che, creando un indice full-text, dovresti risolvere senza troppi problemi...

C'è una guida qui su mysqlitalia sulla creazione di indici full-text


Salvatore DC

La mente è come un paracadute: funziona solo se si apre. A.Einstein.

07 Dicembre, 2011 19:18 #3
rodolforizzo76
Utente

rodolforizzo76
Registrato: Dec, 2011
Posts: 47
Offline

Adesso provo a dare un'occhiata :)


Beh, eh... no, non esattamente. È... ah, è molto complicato come caso. Un mucchio di input e output. Una quantità di informazioni, e un mucchio di elementi da considerare. Ho una quantità di elementi da tenere presente. Fortunatamente io rispetto un regime di droghe piuttosto rigido per mantenere la mente, diciamo, flessibile...
-- The big Lebowski --

07 Dicembre, 2011 19:44 #4
rodolforizzo76
Utente

rodolforizzo76
Registrato: Dec, 2011
Posts: 47
Offline

quindi se ho ben capito dovrei modificare la mia tabella dl_user con:

ALTER TABLE dl_user ADD FULLTEXT full (nome, cognome)

e poi modificare la query usando REGEXP al posto di LIKE in questo modo:

SELECT * FROM images, dl_user WHERE
concat(dl_user.nome, ' ', dl_user.cognome) REGEXP '$stringa'
AND dl_user.username = images.image_username

dovrebbe andare?


Beh, eh... no, non esattamente. È... ah, è molto complicato come caso. Un mucchio di input e output. Una quantità di informazioni, e un mucchio di elementi da considerare. Ho una quantità di elementi da tenere presente. Fortunatamente io rispetto un regime di droghe piuttosto rigido per mantenere la mente, diciamo, flessibile...
-- The big Lebowski --

07 Dicembre, 2011 19:56 #5
re-verse
Moderatore

re-verse
Registrato: Jul, 2008
Posts: 312
Offline

come mai hai usato il regexp? ...
nel tuo caso, una volta creato l'indice full-text sulle due colonne nome e cognome, la tua query dovrebbe essere più o meno così:

1SELECT *
2,(MATCH(u.nome, u.cognome) AGAINST('$stringa')) AS attinenza
3FROM images AS i
4INNER JOIN dl_users u on i.image_username=u.username
5WHERE MATCH(u.nome, u.cognome) AGAINST('$stringa')
6ORDER BY attinenza

Le righe 2 e 6 le ho aggiunte per mostrarti le potenzialità anche per l'attinenza della ricerca, ma se vuoi per adesso puoi anche ometterle


Salvatore DC

La mente è come un paracadute: funziona solo se si apre. A.Einstein.

07 Dicembre, 2011 20:02 #6
rodolforizzo76
Utente

rodolforizzo76
Registrato: Dec, 2011
Posts: 47
Offline

adesso provo a creare l'indice full-text sulle due colonne
(creare l'indice full-text comporta un calo di prestazioni?)
poi provo la query che hai scritto.
grazie!


Beh, eh... no, non esattamente. È... ah, è molto complicato come caso. Un mucchio di input e output. Una quantità di informazioni, e un mucchio di elementi da considerare. Ho una quantità di elementi da tenere presente. Fortunatamente io rispetto un regime di droghe piuttosto rigido per mantenere la mente, diciamo, flessibile...
-- The big Lebowski --

07 Dicembre, 2011 20:16 #7
re-verse
Moderatore

re-verse
Registrato: Jul, 2008
Posts: 312
Offline

mah guarda... se non hai a che fare con centinaia di migliaia di records, direi che per adesso puoi anche trascurare la questione delle prestazioni ;)


Salvatore DC

La mente è come un paracadute: funziona solo se si apre. A.Einstein.

07 Dicembre, 2011 20:17 #8
rodolforizzo76
Utente

rodolforizzo76
Registrato: Dec, 2011
Posts: 47
Offline

ok ho creato l'indice full-text e provato la query.

Adesso se si prova a cercare alla pagina: http://www.painteronline.org/search.php con la stringa "rizzo maurizio" mi restituisce, oltre a rizzo maurizio, anche maurizio ribellino che è un altro dei pittori presenti nel database.

Bisognerebbe che restituisse solo maurizio rizzo
Per avere entrambi la stringa dovrebbe contenere solo "maurizio".


Beh, eh... no, non esattamente. È... ah, è molto complicato come caso. Un mucchio di input e output. Una quantità di informazioni, e un mucchio di elementi da considerare. Ho una quantità di elementi da tenere presente. Fortunatamente io rispetto un regime di droghe piuttosto rigido per mantenere la mente, diciamo, flessibile...
-- The big Lebowski --

07 Dicembre, 2011 20:24 #9
rodolforizzo76
Utente

rodolforizzo76
Registrato: Dec, 2011
Posts: 47
Offline

non ho ben capito la u cosa indica, ad esempio qui:
,(MATCH(u.nome, u.cognome) AGAINST('$stringa')) AS attinenza

u.nome, la u per cosa sta?

le mie tabelle sono images e dl_user


Beh, eh... no, non esattamente. È... ah, è molto complicato come caso. Un mucchio di input e output. Una quantità di informazioni, e un mucchio di elementi da considerare. Ho una quantità di elementi da tenere presente. Fortunatamente io rispetto un regime di droghe piuttosto rigido per mantenere la mente, diciamo, flessibile...
-- The big Lebowski --

07 Dicembre, 2011 20:59 #10
rodolforizzo76
Utente

rodolforizzo76
Registrato: Dec, 2011
Posts: 47
Offline

comunque anche così penso che va bene.
Grazie per l'aiuto. :)


Beh, eh... no, non esattamente. È... ah, è molto complicato come caso. Un mucchio di input e output. Una quantità di informazioni, e un mucchio di elementi da considerare. Ho una quantità di elementi da tenere presente. Fortunatamente io rispetto un regime di droghe piuttosto rigido per mantenere la mente, diciamo, flessibile...
-- The big Lebowski --

Condividi su:

Loggati o Registrati per replicare