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

    [CURIOSITA'] Ricerche in DB con metodo levenshtein ed strpos

    Ci sono alternative che restituiscono lo stesso risultato ma che magari sono piu' semplici o veloci ???

    Solo una curiosita' , io ho provato questa e come risultato non e' male ...

    codice:
    
    <?php // 4
    // supponiamo di avere un database di nome database con una tabella table
    // che contiene id e name , dove name e' il nome di qualcuno o di qualcosa ...
    
    
    // CONNESSIONE AL DATABASE
    	$db = mysql_connect( 'localhost', 'root', '' );
    	mysql_select_db( 'database' );
    
    
    // IMPOSTAZIONI RICERCA
    
    	// CHIAVE DA CERCARE
            $search = "test";
    	
    	// PRECISIONE NELLA RICERCA ( 1 bassissima, 10 abbastanza elevata elevata )
            // [ comunque da len $search in su il risultato e' identico ... ]
    	$searchPrecision  = 1;
    	
    	// LIMITE RISCONTRI DA MOSTRARE
    	$limitmatches = 10;
    	
    
    // INIZIO PROGRAMMA
    
    	// VARIABILE CONTENENTE PARTE DELLA QUERY
    	$search4query = "";
    	
    	// IN BASE ALLA PRECISIONE SCELTA ...
    	for( $a = 0, $b = strlen( $search ); $a < $b; $a += $searchPrecision ) {
    		// DIVIDO LA CHIAVE DI RICERCA E FACCIO L' ESCAPE
    		$tempstr = mysql_escape_string( substr( $search, $a, $searchPrecision ) );
    		// ACCODO ALLA VARIABILE nometabella LIKE '%valore%' OR
    		$search4query .= "name LIKE '%{$tempstr}%' OR ";
    	}
    	// ELIMINO ULTIMO ' OR' DALLA QUERY E LA CREO PER ESTESO
    	$search4query = "SELECT id, name FROM table WHERE ".substr( $search4query, 0, -3 );
    	
    	// ESEGUO LA QUERY
    	$dbQuery = mysql_unbuffered_query( $search4query );
    	
    	// VARIABILE CONTENENTE I RISULTATI
    	$matchresult = Array();
    
    	// CICLO LA QUERY APPENA FATTA
    	while( $dbQuery && $result = mysql_fetch_row( $dbQuery ) ) {
    		// CALCOLO IL levenshtein TRA MATCH E CHIAVE DI RICERCA
    		$lev = levenshtein( $result[1], $search );
    		// SE E' ALMENO COMPRESO TRA 0 E 255 ...
    		if( $lev >= 0 ) {
    			// CONTROLLO CHE LA CHIAVE NON SIA IDENTICA O DENTRO IL RISULTATO ...
    			if( $lev > 0 && strpos( $result[1], $search ) !== false ) {
    				// PERCHE' SE COSI' E' , IMPOSTO NON A ZERO MA ALMENO A
    				// UNO QUESTA RIGA COSI' DA PILOTARE I RISCONTRI
    				// DEL levenshtein PONENDO ALMENO AD 1 TUTTI I
    				// RISULTATI CONTENENTI TALE CHIAVE
    				$lev = 1;
    			}
    			// SETTO L' ARRAY QUALORA NON FOSSE ESISTENTE
    			if( isSet( $matchresult[$lev] ) == false ) {
    				$matchresult[$lev] = Array();
    			}
    			// AGGIUNGO VALORI IN POSIZIONE ARRAY[$lev]
    			// COSI' DA POTERLI ORDINARE POI ...
    			array_push(
    				$matchresult[$lev],
    				Array(
    					'id'=>$result[0],
    					'value'=>$result[1],
    					'match'=>$lev
    				)
    			);
    		}
    	}
    
    
    	// SE HO OTTENUTO ALMENO UN RISULTATO
    	if( count( $matchresult ) > 0 ) {
    		
    		// RIORDINO PER CHIAVI L' ARRAY E LO RESETTO
    		ksort( $matchresult );
    		reset( $matchresult );
    		
    		// VARIABILE DI OUTPUT
    		$output = "";
    		// VARIABILE DI CONTROLLO RISULTATI
    		$templimit = 0;
    		
    		// PER OGNI CHIAVE DELL' ARRAY ORDINATO IN ORDINE CRESCENTE ...
    		foreach( $matchresult as $value ) {
    			// LEGGO TUTTI GLI ARRAY INTERNI ...
    			for( $a = 0, $b = count( $value ); $a < $b; $a++ ) {
    				// SE SONO OLTRE IL LIMITE MASSIMO DI RISULTATI
    				if( $templimit >= $limitmatches ) {
    					// BLOCCO QUESTO FOR
    					$a = $b;
    					// break ? .... volendo si
    				}
    				// ALTRIMENTI AGGIUNGO AD OUTPUT I DATI INTERESSATI
    				else {
    					$output .= "
    					Match: {$value[$a]['match']}
    
    					Id: {$value[$a]['id']}
    
    					Testo: {$value[$a]['value']}<hr />
    					";
    					
    					// INCREMENTO LA VARIABILE DI CONTRLLO MAX RISULTATI
    					$templimit++;
    				}
    			}
    		}
    		
    		// STAMPO L' OUTPUT
    		echo $output;
    	}
    
    
    	// CHIUDO IL DATABASE
    	mysql_close( $db );
    ?>
    
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    Belloooo


    hai gia' provato:

    SELECT id, name FROM table WHERE MATCH(name) AGAINST ('$tempstr');


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    [supersaibal]Originariamente inviato da piero.mac
    Belloooo
    [/supersaibal]




    [supersaibal]Originariamente inviato da piero.mac
    hai gia' provato:

    SELECT id, name FROM table WHERE MATCH(name) AGAINST ('$tempstr');

    [/supersaibal]
    si, so delle funzioni dedicate SQL ma non so se portano a quello che intendo io ... ti faccio un esempio:

    http://it.php.net/manual-lookup.php?pattern=pippo

    questo link ti porta a cercare pippo su php.net ... dici che hanno usato quella query o magari hanno fatto in altri modi ??? :master:



    comunque ora faccio un test, ti faro' sapere


    P.S. pero' richiede per forza il FULLTEXT per le tabelle
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    [supersaibal]Originariamente inviato da andr3a


    P.S. pero' richiede per forza il FULLTEXT per le tabelle [/supersaibal]
    Yes SIR!

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    [supersaibal]Originariamente inviato da piero.mac
    Yes SIR! [/supersaibal]
    e i risultati sono identici, migliori, analoghi ... o cosa ??


    non ho fulltext in nessun db di prova
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    [supersaibal]Originariamente inviato da andr3a
    e i risultati sono identici, migliori, analoghi ... o cosa ??


    non ho fulltext in nessun db di prova [/supersaibal]
    Dovrei provare il tuo script...

    potresti sempre fare una tabella ad hoc.. come farei pure io se dovessi provare il tuo script.

    Sicuramente match against in boolean mode raggiunge un elevato grado di raffinatezza nella ricerca. ma anche senza il boolean mode. Lo puoi pure usare nel SELECT e non solo nel WHERE. Chiaramente con FULL TEXT la performance cala... ma ti trova le similitudini e puo' metterle in ordine di pertinenza...

    Mi riprometto di provare il tuo script.... magari e' una fagianata, nel senso che scopre l'acqua calda, ma hai un modo di mettere giu' il codice ben dettagliato e commentato che invoglia a testarlo.

    [berlusca_mode]Quando la forma convince sulla sostanza... [/berlusca_mode]


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.