Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Richiesta sul peso delle query

    Buongiorno ragazzi,
    vorrei chiedervi se c'è un modo da utilizzare nalla programmazione php per cui si possano privilegiare degli esiti di ricerca rispetto a quello generale.
    Esempio se nel database cercassi: Vivaldi ovviamente vorrei che il peso del risultato le 4 stagioni fosse in rilevanza e rispetto ad altre opere da lui scritte.

    C'è un modo per far questo? Potreste indicarmi le fonti o dove informarmi o quale meccanismo di programmazione adottare per effettuarlo?

    Molte grazie

  2. #2
    Se non ho capito male quello che ti serve è una sorta di sistema di rating con cui stabilire la rilevanza dei dati. Un approccio molto brutale, e non necessariamente corretto, potrebbe essere quello di aggiungere un campo rating nel database in corrispondenza ad esempio di ogni brano, poi sulla query usi un order by rating. Fatto questo recuperi i valori già disposti in base al rating e te li gestisci come meglio credi.
    Fare o non fare....non c'è provare!

  3. #3
    Originariamente inviato da Sbidiguda
    Se non ho capito male quello che ti serve è una sorta di sistema di rating con cui stabilire la rilevanza dei dati. Un approccio molto brutale, e non necessariamente corretto, potrebbe essere quello di aggiungere un campo rating nel database in corrispondenza ad esempio di ogni brano, poi sulla query usi un order by rating. Fatto questo recuperi i valori già disposti in base al rating e te li gestisci come meglio credi.
    Grazie per la risposta.
    Il database non tiene conto solo di brani musicali bensì di opere d'arte in generale.
    Visto che utilizzo anche un campo tag, potrei inserire anche lì rating e poi ordinarle come dici.
    Oppure molto più semplicemente attraverso la programmazione privilegiare le ricerche per titolo con un peso elevato e gli altri particolari di conseguenza.

  4. #4
    Visto che hai articolato il database in opere->brani allora puoi metterlo direttamente sull'opera, quindi a sua volta l'intero contenuto dell'opera virtualmente avrà un rating alto. Cosa intendi con:
    "Oppure molto più semplicemente attraverso la programmazione privilegiare le ricerche per titolo con un peso elevato e gli altri particolari di conseguenza."?
    Fare o non fare....non c'è provare!

  5. #5
    Originariamente inviato da Sbidiguda
    Visto che hai articolato il database in opere->brani allora puoi metterlo direttamente sull'opera, quindi a sua volta l'intero contenuto dell'opera virtualmente avrà un rating alto. Cosa intendi con:
    "Oppure molto più semplicemente attraverso la programmazione privilegiare le ricerche per titolo con un peso elevato e gli altri particolari di conseguenza."?
    Nel senso che utilizzerò tre campi per una ricerca generica: Titolo, Autore e Tag. Magari il titolo prenderà un valore maggiore rispetto al tag. Qualora andrò a specificare esattamente i campi con dei form, come anno morte, incipit, titolo internazionale ecc.. loro avranno una valenza minore in modo che definisca una gerarchia di scelte.

  6. #6
    Secondo me rischi di impelagarti più del necessario discriminando in quel modo .
    Fare o non fare....non c'è provare!

  7. #7
    Ho trovato questo script, e cercavo di utilizzarlo,


    Codice PHP:
    <?
    // PulisciQuery: Restituisce la query pulita da porole inutili(congiunzioni etc.)
    function PulisciQuery($queryvar){
        
    // array parole di cui non tener conto nelle ricerche
        
    $arrayBadWord=Array("lo""l""il""la""i""gli""le""uno""un""una""un""su""sul""sulla""sullo""sull""in""nel""nello""nella""nell""con""di""da""dei""d",  "della""dello""del""dell""che""a""dal""è""e""per""non""si""al""ai""allo""all""al""o");
        
    $queryclean=strtolower($queryvar);
        for(
    $a=0;$a<count($arrayBadWord);$a++){
            
    // sostituisco bad words con espressioni regolari \b ->solo se parole singole, non facenti parti di altre
            
    $queryclean=preg_replace("/\b".$arrayBadWord[$a]."\b/"""$queryclean);
        }
        
    // elimino tutti caratteri non alfanumerici sostituendeli con uno spazio
        
    $queryclean=preg_replace("/\W/"" "$queryclean);
        return 
    $queryclean;
    }

    // QueryToArray: Restituisce array delle parole chiave da cercare
    function QueryToArray($queryvar){
        
    // pulisco query da parole accessorie e caratteri non alfanumerici
        
    $querypulita=PulisciQuery($queryvar);
        
    // costruisco l'array contenente tutte le parole da cercare
        
    $arraySearch=explode(" "$querypulita);
        
    // elimino doppioni dall'array
        
    $arraySearchUnique=array_unique($arraySearch);
        
    // elimino valori array vuoti o con solo spazi
        
    $arrayVuoto=Array(""," ");
        
    $arrayToReturn=array_diff($arraySearchUnique$arrayVuoto);
        return 
    $arrayToReturn;
    }

    // CreaQueryRicerca: Creo la query di ricerca. 
    // peso titolo se non specificato=5, peso testo se non specificato=3
    // searchlevel -> 1 o 0. default 1. Se 0 trova parole non complete. Es. cerchi osso?ok anche ossobuco. Se 1 non succede.
    function CreaQueryRicerca($queryvar$pesotitolo=5$pesotesto=3$searchlevel=1){
        
    // trasformo la stringa in un array di parole da cercare
        
    $arrayToFind=QueryToArray($queryvar);
        
    // numero elementi da cercare
        
    $elementiToFind=count($arrayToFind);    
        
    // punteggio massimo raggiungibile
        
    $maxPoint=$elementiToFind*$pesotitolo+$elementiToFind*$pesotesto;
        if(
    $elementiToFind==0){
            return 
    "";
        }else{
            
    $query="select ROUND((";
            
    $sqlwhere="";
            
    // ciclo per ogni parola trovata ($Valore)
            
    foreach($arrayToFind As $Indice => $Valore){
                
    // se $Valore è presente in titolo instr(titolo, '$Valore') restituirà 1 altrimenti 0
                // moltiplico il valore restituito (1 o 0) per il peso della parola (5 per il titolo, 3 per testo)    
                
    if($searchlevel==1){
                    
    // regexp: uso espressioni regolari. [[:<:]] equivale a \b per separare parole
                    
    $query.="((titolo REGEXP '[[:<:]]".$Valore."[[:>:]]')>0)*$pesotitolo+";
                    
    $query.="((testo REGEXP '[[:<:]]".$Valore."[[:>:]]')>0)*$pesotesto+";
                    
    $sqlwhere.="titolo REGEXP '[[:<:]]".$Valore."[[:>:]]' OR testo REGEXP '[[:<:]]".$Valore."[[:>:]]' OR ";
                }else{
                    
    $query.="(instr(titolo, '$Valore')>0)*$pesotitolo+";
                    
    $query.="(instr(testo, '$Valore')>0)*$pesotesto+";
                    
    $sqlwhere.="titolo like '%$Valore%' OR testo like '%$Valore%' OR ";
                }
            }
            
    $sqlwhere=substr($sqlwhere0strlen($sqlwhere)-4);
            
    // calcolo la percentuale di rilevanza  --> rilevanza*100/$maxPoint
            
    $query.="0)*100/$maxPoint,2) as rilevanza, ID, titolo from tabella WHERE $sqlwhere order by rilevanza DESC";
            return 
    $query;
        }
    }

    // stringa da ricercare presa da form.
    //$queryvar="parola1 parola2"; //esempio
    if(isset($_POST['search'])){$queryvar=$_POST['search'];}else{$queryvar="";}

    if(
    trim($queryvar)=="" || strlen(trim($queryvar))<=3){
        echo 
    "La stringa di ricerca deve contenere più di 3 caratteri.";
    }else{
        
    // query da eseguire 
        // primo valore passato è peso delle parole cercate nel titolo, secondo peso parole nel testo
        // terzo valore cercato: 1 o0: accuratezza ricerca. Se 0 trova parole non complete. Es. cerchi osso?ok anche ossobuco. Se 1 non succede.
        // CreaQueryRicerca($queryvar) -> prende primo e secondo valore di default
        
    $queryRicerca=CreaQueryRicerca($queryvar531);
        
    // Eseguo la query
        // La query restituisce ID, titolo e % di rilevanza del risultato
        
    echo $queryRicerca;
    }
    ?>
    Ed io ho fatto piccole modifiche:
    Codice PHP:
    <?php

      
      $queryvar 
    $_GET['k'];
      
    // PulisciQuery: Restituisce la query pulita da porole inutili(congiunzioni etc.)
    function PulisciQuery($queryvar){
        
    // array parole di cui non tener conto nelle ricerche
        
    $arrayBadWord=Array("lo""l""il""la""i""gli""le""uno""un""una""un""su""sul""sulla""sullo""sull""in""nel""nello""nella""nell""con""di""da""dei""d",  "della""dello""del""dell""che""a""dal""è""e""per""non""si""al""ai""allo""all""al""o");
        
    $queryclean=strtolower($queryvar);
        for(
    $a=0;$a<count($arrayBadWord);$a++){
            
    // sostituisco bad words con espressioni regolari \b ->solo se parole singole, non facenti parti di altre
            
    $queryclean=preg_replace("/\b".$arrayBadWord[$a]."\b/"""$queryclean);
        }
        
    // elimino tutti caratteri non alfanumerici sostituendeli con uno spazio
        
    $queryclean=preg_replace("/\W/"" "$queryclean);
        return 
    $queryclean;
           
    }

    // QueryToArray: Restituisce array delle parole chiave da cercare
    function QueryToArray($queryvar){
     
        
        
    // pulisco query da parole accessorie e caratteri non alfanumerici
        
    $querypulita=PulisciQuery($queryvar);
        
    // costruisco l'array contenente tutte le parole da cercare
        
    $arraySearch=explode(" "$querypulita);
        
    // elimino doppioni dall'array
        
    $arraySearchUnique=array_unique($arraySearch);
        
    // elimino valori array vuoti o con solo spazi
        
    $arrayVuoto=Array(""," ");
        
    $arrayToReturn=array_diff($arraySearchUnique$arrayVuoto);
        return 
    $arrayToReturn;
    }

    // CreaQueryRicerca: Creo la query di ricerca. 
    // peso titolo se non specificato=5, peso testo se non specificato=3
    // searchlevel -> 1 o 0. default 1. Se 0 trova parole non complete. Es. cerchi osso?ok anche ossobuco. Se 1 non succede.
    function CreaQueryRicerca($queryvar$pesotitolo=5$pesoautore=3$searchlevel=1){
        
    // trasformo la stringa in un array di parole da cercare
        
    $arrayToFind=QueryToArray($queryvar);
        
    // numero elementi da cercare
        
    $elementiToFind=count($arrayToFind);    
        
    // punteggio massimo raggiungibile
        
    $maxPoint=$elementiToFind*$pesotitolo+$elementiToFind*$pesoautore;
        if(
    $elementiToFind==0){
            return 
    "";
        }else{
            
    $query="select ROUND((";
            
    $sqlwhere="";
            
    // ciclo per ogni parola trovata ($Valore)
            
    foreach($arrayToFind As $Indice => $Valore){
                
    // se $Valore è presente in titolo instr(titolo, '$Valore') restituirà 1 altrimenti 0
                // moltiplico il valore restituito (1 o 0) per il peso della parola (5 per il titolo, 3 per testo)    
                
    if($searchlevel==1){
                    
    // regexp: uso espressioni regolari. [[:<:]] equivale a \b per separare parole
                    
    $query.="((titolo REGEXP '[[:<:]]".$Valore."[[:>:]]')>0)*$pesotitolo+";
                    
    $query.="((autore REGEXP '[[:<:]]".$Valore."[[:>:]]')>0)*$pesoautore+";
                    
    $sqlwhere.="Titolo REGEXP '[[:<:]]".$Valore."[[:>:]]' OR Autore REGEXP '[[:<:]]".$Valore."[[:>:]]' OR ";
                }else{
                    
    $query.="(instr(titolo, '$Valore')>0)*$pesotitolo+";
                    
    $query.="(instr(autore, '$Valore')>0)*$pesoautore+";
                    
    $sqlwhere.="Titolo like '%$Valore%' OR Autore like '%$Valore%' OR ";
                }
            }
            
    $sqlwhere=substr($sqlwhere0strlen($sqlwhere)-4);
            
    // calcolo la percentuale di rilevanza  --> rilevanza*100/$maxPoint
            
    $query.="0)*100/$maxPoint,2) as rilevanza, Tiolo, Autore from ((Autore right JOIN Creazione ON ID=Autore)right join Opera on Opera=Opera.ID)left join File ON Opera.ID=File.Opera 
                    WHERE 
    $sqlwhere order by rilevanza DESC";
                    
            return 
    $query;
        }

    //echo 
    // stringa da ricercare presa da form.
    //$queryvar="parola1 parola2"; //esempio
    if(isset($_POST['search'])){$queryvar=$_POST['search'];}else{$queryvar="";}

    if(
    trim($queryvar)=="" || strlen(trim($queryvar))<=3){
        echo 
    "La stringa di ricerca deve contenere più di 3 caratteri.";
    }else{
        
    // query da eseguire 
        // primo valore passato è peso delle parole cercate nel titolo, secondo peso parole nel testo
        // terzo valore cercato: 1 o0: accuratezza ricerca. Se 0 trova parole non complete. Es. cerchi osso?ok anche ossobuco. Se 1 non succede.
        // CreaQueryRicerca($queryvar) -> prende primo e secondo valore di default
        
    $queryRicerca=CreaQueryRicerca($queryvar531);
        
    // Eseguo la query
        // La query restituisce ID, titolo e % di rilevanza del risultato
        
    echo $queryRicerca;
    }
    ?>
    ma non ce la faccio, non ottengo alcuna query... mi dice solamente: "La stringa di ricerca deve contenere più di 3 caratteri".
    Dove sbaglio?

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.