Newsgroup: it.comp.www.php
Titolo: ricerca parola in un elenco sperarato da virgole

Mettiamo che ho un campo di una tabella che contiene questa serie di
keywords:
audio, video,impianti stereo,hi fi, hi-fi,stereo,sterei, autoradio, car
center, home theater, tv, televisione, televisioni, televisori,televisore,
plasma, lcd, crt, navigatori, radio,mp3,cd, compact disc,dvd,
lettori,casse,altoparlanti,dvd-r,blueray,blue ray, blue-ray,hddvd,hd-dvd,
hd, amplificatori,antennista, antenne, antenna, paraboliche, parabolica,
satellitari, satellitare,decoder,sky,digitale, terrestre,parabole,
dipoli,feed,audio, video,impianti stereo,hi fi,stereo,sterei, autoradio,
car, center, home, theater, tv, televisione, televisioni,
televisori,televisore, plasma, lcd, crt, navigatori, navigatore,
radio,mp3,cd, compact, disc,dvd, sky,
lettori,casse,altoparlanti,dvd-r,blueray,blue, ray, blue-ray,hddvd,hd-dvd,
hd, amplificatori,amplificazione, amplificatore, amplificazioni,audio,
video, televisione,  televisioni, schermo, schermi,  proiettore,
proiettori, riparazione video, riparazioni
Mi servirebbe sapere come posso ricercare una frase o una serie di parole
INTERE all'interno delle singole frasi separate dalla virgola.
Esempio Se cerco la parola "pianti" non mi deve trovare la parola
"impianti" ma al limite non mi trova nulla, in pratica č come se potessi
splittare il testo nelle singole frasi separate dalla virgola e all'interno
trovare la parola intera.
Grazie milla.
Stefano

Stefano ha scritto:

con explode() (
http://it.php.net/explode
) trasformi il testo in un 
array. Poi cicli l'array e controlli se il valore č uguale.

 array. Poi cicli l'array e controlli se il valore è uguale.
Buona la prima (explode), ma alla seconda portiamo una correzione:
esiste l'apposita funzione
bool in_array ( mixed needle, array haystack [, bool strict] )
Attento ad eventuali spazi prima o dopo la virgola... per rimuoverli 
potresti fare un passata con array_map ("trim", $array)
Alla fine valuta bene le prestazioni del giochino (explode, trim degli 
spazi, ricerca elemento...)  Per assurdo, se hai la sicurezza di non 
avere spazi prima o dopo la virgola e puoi mettere una virgola all'inzio 
ed una alla fine della sequenza, risolvi il tutto con un strpos:
$lista ",mp3,cd,dvd,pinco,pallino,";
$elemento = ",cd,";
if(strpos($lista, $elemento) === FALSE)) {
	echo "Not found";
} else {
	echo "Found";
}
	Francesco

 }
Mi sa che non mi sono spiegato, l'elenco delle keywords sono all'interno di
una tabella mysql, sarebbe utile che questa operazione la facesse il
database e mi restituisse gli id delle colonne che contengono la parola
ricercata, stavo leggendo di MATCH e RLIKE ma non ho capito bene il
funzionamento.
Ciao Stefano 

 Ciao Stefano 
Beh la situazione cambia, ma di poco!
Se lo spazio tra le virgole c'e' sempre o mai, puoi andare anche via 
mysql con POSITION() e fare una ricerca con oppure visto che hai citato 
rlike ti fai una bella regexp che valuta la stringa con o senza gli 
spazi tra le virgole; altrimenti tagli la testa al toro e prima di 
inserire il record nel db lo "correggi" togliendo (o aggiungendo) gli 
spazi tra le virgole, una virgola iniziale ed una finale e trovi la 
corrispondenza nel solito del precedente post POSITION(",cd,", field)
Un consiglio: leggi bene la doc su MATCH e capirai che non è adatto a 
far quello che chiedi
Un'ultima cosa, sei OT visto che il problema, come hai riportato in 
questo post è esclusivamente su mysql.
	Francesco

 questo post è esclusivamente su mysql.
Non ho capito molto di quello che hai scritto un semplice esempio sarebbe
stato utile, comunque ho postato l'articolo su newsgroup dei database.
ciao e grazie lo stesso, Stefano

 ciao e grazie lo stesso, Stefano
Non è facile scrivere un semplice esempio se non illustri la situazione 
in modo chiaro.
1 - Chi inserisce i dati nel db e in che modo?
2 - Puoi, prima di inserire i dati nel db, eliminare o aggiungere i 
caratteri di troppo ed alcuni caratteri che ti facilitano la ricerca?
3 - Conosci l'uso delle regexp?
Per adesso mi fermo qui :-)
	Francesco

 3 - Conosci l'uso delle regexp?
Abbastanza sotto ASP ma credo che funzionino lo stesso sotto PHP, mai
utilizzati all'interno di una query con mysql (se mai si dovesse
utilizzare).
Vista la tua cortesia faccio un piccolo riepilogo: ho una tabella simile a
questa
id     |               keywords                   |
-------+------------------------------------------+
1      | impianti stereo,hi fi,stereo,            |
       | navigatori satellitari, ricevitori gps   |
-------+------------------------------------------+
2      | impianti satellitari,parabole,cellulari, |
       | impianti gps, navigatori per cellulari,
Ora quello che cerco è una funziona (credo in mysql) che se scrivo la frase
"navigatori cellulari" lui mi trovi SOLO il record 2 e non il primo.
In soldoni è come se io splittassi il campo nella singole frasi separate
dalla virgola e dentro queste frasi lui trovi TUTTE le occorrenze cercate,
nella fattispecie le parole "navigatori" e "cellulari" che sono presenti
entrambe solo nel record 2.
al momento io riesco trovo sia il record 1 che il 2 in quanto le singole
parole si trovano in emtrambe i record ma in certe situazioni sarebbe più
corretto ottenere solo il secondo.
Ciao Stefano

Allora riporto una soluzione più completa della mia per la ricerca di
parole direttamente da una query di mysql, questo messaggio è un cross post
dal newgroup sui database dove mi hanno dato questa risposta, credo di fare
cosa utile anche qui: 
---------------------------
1) aggiungi alla tabella (che deve essere di tipo MyISAM) un indice
FULLTEXT
   per esempio, se il campo con le parole chiave si chiama 'riferimenti'
   ALTER TABLE nome_tabella add FULLTEXT (riferimenti);
2) ricerca usando questo costrutto
  # cercare 'pianti'
  SELECT elenco_campi
  FROM nome_tabella
  WHERE match(riferimenti) AGAINST ('pianti');
Stai attento che, in questo contesto (senza IN BOOLEAN MODE) se la parola
compare in più del 50% dei record, non viene
trovata
  # cercare 'pianti' in modo assoluto
  SELECT elenco_campi
  FROM nome_tabella
  WHERE match(riferimenti) AGAINST ('+pianti' IN BOOLEAN MODE);
  # cercare parole che cominciano con 'pianti'
  SELECT elenco_campi
  FROM nome_tabella
  WHERE match(riferimenti) AGAINST ('+pianti*' IN BOOLEAN MODE);
  # cercare 'video' e 'stereo'
  SELECT elenco_campi
  FROM nome_tabella
  WHERE match(riferimenti) AGAINST ('+video +stereo' IN BOOLEAN MODE );
  # cercare 'video' e ( 'stereo' oppure 'mono')
  SELECT elenco_campi
  FROM nome_tabella
  WHERE match(riferimenti) AGAINST ('+video +(stereo mono)' IN BOOLEAN MODE
);
--------------------------

Scusate se mi intrometto.
Forse non ho capito il problema, ma se per caso l'avessi capito, la soluzione dovrebbe essere:
SELECT campi FROM tabella WHERE camporicerca LIKE parolaricerca
campi sono i campi che vuoi ritornare, tabella è la tabella che contiene i dati, camporicerca il campo che contiene tutte le parole, parolaricerca la parola da cercare. Se usi *pianti ti ritorna anche impianti, se usi solo pianti, cerca la corrispondenza esatta.
Io lo uso in un database per cercare articoli con parole diverse nel campo ricerca e funziona. Penso che vada bene anche per questo. 
Prova e fammi sapere.
Adesso che rileggo la spiegazione mi vengono dei dubbi.
Controllo meglio anch'io.
Ciao.

PaoloS ha scritto:

Ho controllato:
LIKE può funzionare nella forma '%parola%', ma in questo caso con l'esempio pianti ti riporta anche impianti. L'unica soluzione è che ogni parola sia preceduta da una virgola e uno spazio (, pianti) o almeno da uno spazio, ma in questo caso quando cerchi video (% video%) ti ritorna anche riparazioni video.
Sta a te vedere se è accettabile, se puoi modificare l'immissione dei dati eccetera.
Spero di averti aiutato.
Ciao.