Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1

    ricerca testo che contenga due o più parole

    Devo effettuare delle ricerche su testo (circa 15.000 campi testo in un db Mysql) utilizzando anche due o tre parole per volta.
    Siccome non voglio le limitazioni della ricerca fulltext sto cercando di adoperare l'operatore like. Il mio problema è che se inserisco nel campo chiave una parola o due parole adiacenti nella stringa il testo viene trovato, ma se le parole sono fra loro distanti, anche se ambedue contenute nello stesso testo, la ricerca non produce risultati. Es.:
    stringa: "Oggi è una bella giornata di sole"
    se cerco: 'Oggi ' oppure'Oggi è' ottengo il mio testo
    se cerco 'Oggi sole' non ottengo nulla.

    nella query la clausola WHERE è:
    codice:
    testo LIKE %chiave%
    Grazie!

  2. #2
    Utente di HTML.it L'avatar di zoseppe
    Registrato dal
    Jan 2005
    Messaggi
    306
    la butto lì.....se hai più parole, supponiamo separate da spazi:
    Codice PHP:

    $input
    =explode(" "$parole);
    $query="SELECT * FROM tuatabella WHERE nome_campo LIKE '%$input[0]%' ";

    for(
    $i=1$i<count($input); $i++)
    {
      
    $query.=" OR LIKE '$input[$i]
    }

    ...
    ...

    resto del codice 
    non l'ho testata chissà se va.....

  3. #3
    Grazie!Adesso provo il tuo codice ma nel frattempo ho pensato che potrei dividere le parole(due o tre) digitate nel campo chiave tramite
    codice:
    $stringa = "Come faccio a dividere una stringa nelle singole parole che la compongono? Grazie.";
    preg_match_all("#\b\w+\b#",$stringa,$ris);
    print_r($ris[0]);
    poi potrei gestire le parole con AND e OR. E' una cavolata o è un'altra possibilità?

  4. #4
    Utente di HTML.it L'avatar di zoseppe
    Registrato dal
    Jan 2005
    Messaggi
    306
    è un'altra possibilità a tua disposizione!!!

  5. #5
    Il problema è che nnon riesco proprio a capire come si fa pu avendo capito il senso della cosa

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    codice:
    $stringa = "Come faccio a dividere una stringa nelle singole parole che la compongono? Grazie.";
    preg_match_all("#\w{4,}#",$stringa,$ris); // elimini dalla ricerca le parole più corte di 4 caratteri
    $query = 'select * from tabella where ';
    $arr = array();
    foreach($ris[0] as $parola)
    	$arr[] = "testo like \"%$parola%\" ";
    $query.= implode('or ',$arr);
    echo $query;
    Teoricamente è così.

  7. #7
    Utente di HTML.it L'avatar di zoseppe
    Registrato dal
    Jan 2005
    Messaggi
    306
    Ottima davvero Nicola! Ma se volessi fare un controllo non case-sensitive? Come la si dovrebbe Modificare?

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da zoseppe
    Ottima davvero Nicola! Ma se volessi fare un controllo non case-sensitive? Come la si dovrebbe Modificare?
    Il confronto di suo non è case sensitive a meno che tu non abbia un collate cs per il campo.

  9. #9
    Ti ringrazio Nicola per il codice che mi hai scritto e che funziona molto bene: confermo che trova indifferentemente parole scritte in maiuscolo e in minuscolo.
    Sarebbe mia intenzione far si che quando viene visualizzato il testo contenente le mie parole chiave (2 0 3) queste appaiano in neretto. Sono riuscita a farlo per una sola parola con le RegExp:
    codice:
    preg_replace('#'.$chiave.'#si', ''.$chiave.'', $Testo)
    ma non riesco a farlo per tutte le parole chiave quando sono più di una. Penso che si tratti di fare un ciclo, ma ho qualche difficoltà. So che avrei dovuto aprire un nuovo post, ma solo per questa volta non potresti darmi un suggerimento?
    Grazie a tutti

  10. #10

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.