Ricerche FULLTEXT - superare le restrizioni

Gli argomenti di questa pagina

  • Limiti sull'uso della ricerca FULLTEXT
  • Caratteristiche di una tabella FULLTEXT
  • Restrizioni per ricerche FULLTEXT
  • Soluzioni per le Restrizioni ricerche FULLTEXT
  • Come creare Query per ricerche semplici
  • Creazione della Query con la funzione MYSQL LIKE()
  • Creazione della Query con la funzione MYSQL INSTR()
  • Creazione della Query con la funzione MYSQL POSITION()
  • Creazione della Query con la funzione MYSQL LOCATE()

Limiti sull'uso della ricerca FULLTEXT

Come già detto in altre precedenti pagine ricordiamo alcune caratteristiche ed alcuni limiti di cui dobbiamo essere a conoscenza utilizzando le ricerche FULLTEXT. Verranno mpstrate le soluzioni per superare alcune delle restrizioni e dei problemi che si potrebbero incontrare usando questa metodologia per le nostre Query.

Caratteristiche di una tabella FULLTEXT

  • La tabella non può essere creata con il motore InnoDB ma deve essere di tipo MyISAM che sono le uniche tabelle che supportano le ricerche FULLTEXT.
  • Non è possibile effettuare ricerche FULLTEXT su campi di tipo BLOB, numerici o campi di data, i quali, se possibile, dovranno essere convertiti in campi di testo, quindi CHAR, VARCHAR, TEXT.
  • Nella tabella che verrà usata per ricerche FULLTEXT è necessaria la presenza di campi FULLTEXT o, se non sono stati previsti in fase di creazione della tabella, definire gli indici FULLTEXT in un secondo tempo .
  • La tabella usata per ricerche FUULTEXT dovrà contenere almeno 3 record perchè le ricerche abbiano l'effetto desiderato altrimenti si rischia di avere risultati inattesi.

Per raggiungere questi obiettivi bisogna solo capire le caratteristiche annunciate qui sopra.
Per la conversione dei tipi di tabella e per i tipi di campo è sufficiente recarsi al pannello di controllo ed eseguire le dovute conversioni.
Per l'aggiunta e la definizione degli indici FULLTEXT vedere la prima pagina di questo gruppo di pagine che trattano le ricerche FULLTEXT.
Per quanto riguarda il numero di record da aggiungere nella tabella basta eseguire dei normali INSERT coi valori desiderati.

Restrizioni per ricerche FULLTEXT

  • Vengono ignorate parlole di lunghezza inferiore a 4 caratteri.
  • MySQL utilizza un array di stopwords che verranno saltate durante la ricerca.
  • Vengono ignorate parole che sono presenti nel 50% o più delle righe perchè considerate comuni.
    Quest'ultima restrizione viene superata se, invece di usare esplicitamente o non esplicitamente il modificatore IN NATURAL LANGUAGE MODE viene usato il modificatore IN BOOLEAN MODE.

Soluzioni per le Restrizioni ricerche FULLTEXT

La ricerca FULLTEXT potrebbe sembrare una ottima soluzione alla classica ricerca eseguita col la classica WHERE.
Purtroppo non sempre è attuabile. I resultset restituiti sono

  • troppo pochi rispetto alle aspettative per via delle "Restrizioni per ricerche FULLTEXT" anche se le "Caratteristiche di una tabella" sono quelle indicate
  • troppo ridondandi usando il modificatore WITH QUERY EXPANSION

In questi casi è sempre possibile tornare alla classica ricerca aiutati dalla funzione MYSQL LIKE(), da molti nel WEB raccomandato, ma anche da altre funzioni MYSQL quali INSTR(), POSITION() o LOCATE().

Ma prima vediamo in azione la Query FULLTEXT che, in questo caso, è equivalente alle altre Query di seguito elencate.

esempio con MATCH() ... AGAINST()
1
2
3
4
5
6
7
8
<?php
$find 
"funzioni mktime";
$Query "SELECT *
FROM sql_articoli
WHERE MATCH (title, body)
AGAINST ('"
.$find."' IN BOOLEAN MODE)
"
;
?>
che restituisce questa Query
SELECT *
FROM sql_articoli
WHERE MATCH (title, body)
AGAINST ('funzioni mktime' IN BOOLEAN MODE)
5 record letti
id title body
5 La funzione mktime La funzione PHP mktime() restituisce il timestamp UNIX di una certa data, ovvero il numero di secondi trascorsi dal 1 gennaio 1970 alla data in esame.
18 funzioni UPPER() e LOWER() Le due funzioni sono sinonimi delle funzioni MYSQL UCASE() e LCASE(), quindi si comportano allo stesso modo. La funzione UPPER() ritorna una stringa di lettere maiuscole, e la funzione LOWER() la rende minuscola.
20 Ricerca per numero telefonico Togliendo gli spazi ed altri eventuali caratteri separatori è possibile eseguire il controllo solo sulle vere cifre che compongono il numero. Questa operazione di pulizia viene effettuata usando la funzione REPLACE(). Se necessario è possibile usare anche più funzioni REPLACE() nidificate.
27 Le funzioni Somma Se e CONCATENA() Combinazione delle funzioni SOMMA(), SE() e CONCATENA().
Il confronto si esegue tra due coppie di valori per rispondere al quesito:
esegui la somma dei valori che si trovano nella colonna F se l'articolo che sta nella colonna C e se il suo colore che è indicato nella colonna D sono uguali all'articolo indicato nella cella C16 e al colore che ho indicato nella cella C17.
28 Le funzioni VAL.ERR e SE In queste formule usiamo ben tre funzioni del foglio di Excel:
la funzione SE
la funzione VAL.ERRORE
la funzione CERCA.VERTICALE

Come creare Query per ricerche semplici

La ricerca FULLTEXT si distingue dalle normali ricerche in quanto accetta come criterio di ricerca una frase più o meno completa mentre le normali ricerche accettano di norma una singola parola.
Qui di seguito viene presentato un semplice metodo certamente migliorabile aggiungendo altre funzionalità, come per esempio eliminare dal criterio di ricerca certe parole come articoli, preposizioni ed altre parole da individuare.

Una volta ottenuta la frase da usare come criterio di ricerca dobbiamo fare come di seguito spiegato.

  • Con la funzione PHP explode() viene creato un Array di parole
  • Inizio a scrivere la Query fino alla clausola WHERE
  • Istruisco un ciclo per leggere tutti gli elementi dell'Array appena creato
  • Ad ogni iterazione del ciclo assegno la funzione MYSQL scelta a ciascun campo dove si intende cercare la parola di turno offerta dal ciclo
  • Tutte le porzioni di Query vengono aggiunte usando l'operatore OR
  • Uscendo dal ciclo ci troviamo con la Query che finisce con un semplice OR che manderebbe in errore l'esecuzione della Query
  • Per annullare l'effetto dell'ultimo OR è sufficiente aggiungere uno 0 (zero)

Le funzioni MYSQL che andremo a testare sono:
LIKE, INSTR, POSITION, LOCATE

Creazione della Query con la funzione MYSQL LIKE()

La sintassi per la funzione MYSQL LIKE()

field LIKE '%string%'
esempio 1
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$find 
"funzioni mktime";
$keys explode (" "$find);
$Query "SELECT * FROM sql_articoli 
WHERE "
;
for (
$a 0$a count($keys); $a++) {
    
$Query .= "
    (body LIKE '%"
.$keys[$a]."%' 
    OR title LIKE '%"
.$keys[$a]."%') 
    OR "
;
}
$Query .= "0";
?>
che restituisce questa Query
SELECT * FROM sql_articoli 
WHERE 
	(body LIKE '%funzioni%' 
	OR title LIKE '%funzioni%') 
	OR 
	(body LIKE '%mktime%' 
	OR title LIKE '%mktime%') 
	OR 0
5 record letti
id title body
5 La funzione mktime La funzione PHP mktime() restituisce il timestamp UNIX di una certa data, ovvero il numero di secondi trascorsi dal 1 gennaio 1970 alla data in esame.
18 funzioni UPPER() e LOWER() Le due funzioni sono sinonimi delle funzioni MYSQL UCASE() e LCASE(), quindi si comportano allo stesso modo. La funzione UPPER() ritorna una stringa di lettere maiuscole, e la funzione LOWER() la rende minuscola.
20 Ricerca per numero telefonico Togliendo gli spazi ed altri eventuali caratteri separatori è possibile eseguire il controllo solo sulle vere cifre che compongono il numero. Questa operazione di pulizia viene effettuata usando la funzione REPLACE(). Se necessario è possibile usare anche più funzioni REPLACE() nidificate.
27 Le funzioni Somma Se e CONCATENA() Combinazione delle funzioni SOMMA(), SE() e CONCATENA().
Il confronto si esegue tra due coppie di valori per rispondere al quesito:
esegui la somma dei valori che si trovano nella colonna F se l'articolo che sta nella colonna C e se il suo colore che è indicato nella colonna D sono uguali all'articolo indicato nella cella C16 e al colore che ho indicato nella cella C17.
28 Le funzioni VAL.ERR e SE In queste formule usiamo ben tre funzioni del foglio di Excel:
la funzione SE
la funzione VAL.ERRORE
la funzione CERCA.VERTICALE

Creazione della Query con la funzione MYSQL INSTR()

La sintassi per la funzione MYSQL INSTR()

INSTR(field, 'string')
esempio 2
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$find 
"funzioni mktime";
$keys explode (" "$find);
$Query "SELECT * FROM sql_articoli 
WHERE "
;
for (
$a 0$a count($keys); $a++) {
    
$Query .= "
    (INSTR(body, '"
.$keys[$a]."') > 0 
    OR INSTR(title, '"
.$keys[$a]."' ) > 0) 
    OR "
;
}
$Query .= "0";
?>
che restituisce questa Query
SELECT * FROM sql_articoli 
WHERE 
	(INSTR(body, 'funzioni') > 0 
	OR INSTR(title, 'funzioni' ) > 0) 
	OR 
	(INSTR(body, 'mktime') > 0 
	OR INSTR(title, 'mktime' ) > 0) 
	OR 0
5 record letti
id title body
5 La funzione mktime La funzione PHP mktime() restituisce il timestamp UNIX di una certa data, ovvero il numero di secondi trascorsi dal 1 gennaio 1970 alla data in esame.
18 funzioni UPPER() e LOWER() Le due funzioni sono sinonimi delle funzioni MYSQL UCASE() e LCASE(), quindi si comportano allo stesso modo. La funzione UPPER() ritorna una stringa di lettere maiuscole, e la funzione LOWER() la rende minuscola.
20 Ricerca per numero telefonico Togliendo gli spazi ed altri eventuali caratteri separatori è possibile eseguire il controllo solo sulle vere cifre che compongono il numero. Questa operazione di pulizia viene effettuata usando la funzione REPLACE(). Se necessario è possibile usare anche più funzioni REPLACE() nidificate.
27 Le funzioni Somma Se e CONCATENA() Combinazione delle funzioni SOMMA(), SE() e CONCATENA().
Il confronto si esegue tra due coppie di valori per rispondere al quesito:
esegui la somma dei valori che si trovano nella colonna F se l'articolo che sta nella colonna C e se il suo colore che è indicato nella colonna D sono uguali all'articolo indicato nella cella C16 e al colore che ho indicato nella cella C17.
28 Le funzioni VAL.ERR e SE In queste formule usiamo ben tre funzioni del foglio di Excel:
la funzione SE
la funzione VAL.ERRORE
la funzione CERCA.VERTICALE

Creazione della Query con la funzione MYSQL POSITION()

La sintassi per la funzione MYSQL POSITION()

POSITION('string' IN field)
esempio 3
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$find 
"funzioni mktime";
$keys explode (" "$find);
$Query "SELECT * FROM sql_articoli 
WHERE "
;
for (
$a 0$a count($keys); $a++) {
    
$Query .= "
    (POSITION('"
.$keys[$a]."' IN body) > 0 
    OR POSITION('"
.$keys[$a]."' IN title) > 0) 
    OR "
;
}
$Query .= "0";
?>
che restituisce questa Query
SELECT * FROM sql_articoli 
WHERE 
	(POSITION('funzioni' IN body) > 0 
	OR POSITION('funzioni' IN title) > 0) 
	OR 
	(POSITION('mktime' IN body) > 0 
	OR POSITION('mktime' IN title) > 0) 
	OR 0
5 record letti
id title body
5 La funzione mktime La funzione PHP mktime() restituisce il timestamp UNIX di una certa data, ovvero il numero di secondi trascorsi dal 1 gennaio 1970 alla data in esame.
18 funzioni UPPER() e LOWER() Le due funzioni sono sinonimi delle funzioni MYSQL UCASE() e LCASE(), quindi si comportano allo stesso modo. La funzione UPPER() ritorna una stringa di lettere maiuscole, e la funzione LOWER() la rende minuscola.
20 Ricerca per numero telefonico Togliendo gli spazi ed altri eventuali caratteri separatori è possibile eseguire il controllo solo sulle vere cifre che compongono il numero. Questa operazione di pulizia viene effettuata usando la funzione REPLACE(). Se necessario è possibile usare anche più funzioni REPLACE() nidificate.
27 Le funzioni Somma Se e CONCATENA() Combinazione delle funzioni SOMMA(), SE() e CONCATENA().
Il confronto si esegue tra due coppie di valori per rispondere al quesito:
esegui la somma dei valori che si trovano nella colonna F se l'articolo che sta nella colonna C e se il suo colore che è indicato nella colonna D sono uguali all'articolo indicato nella cella C16 e al colore che ho indicato nella cella C17.
28 Le funzioni VAL.ERR e SE In queste formule usiamo ben tre funzioni del foglio di Excel:
la funzione SE
la funzione VAL.ERRORE
la funzione CERCA.VERTICALE

Creazione della Query con la funzione MYSQL LOCATE()

La sintassi per la funzione MYSQL LOCATE()

LOCATE('string', field)
esempio 4
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$find 
"funzioni mktime";
$keys explode (" "$find);
$Query "SELECT * FROM sql_articoli 
WHERE "
;
for (
$a 0$a count($keys); $a++) {
    
$Query .= "
    (LOCATE('"
.$keys[$a]."', body) > 0 
    OR LOCATE('"
.$keys[$a]."', title) > 0) 
    OR "
;
}
$Query .= "0";
?>
che restituisce questa Query
SELECT * FROM sql_articoli 
WHERE 
	(LOCATE('funzioni', body) > 0 
	OR LOCATE('funzioni', title) > 0) 
	OR 
	(LOCATE('mktime', body) > 0 
	OR LOCATE('mktime', title) > 0) 
	OR 0
5 record letti
id title body
5 La funzione mktime La funzione PHP mktime() restituisce il timestamp UNIX di una certa data, ovvero il numero di secondi trascorsi dal 1 gennaio 1970 alla data in esame.
18 funzioni UPPER() e LOWER() Le due funzioni sono sinonimi delle funzioni MYSQL UCASE() e LCASE(), quindi si comportano allo stesso modo. La funzione UPPER() ritorna una stringa di lettere maiuscole, e la funzione LOWER() la rende minuscola.
20 Ricerca per numero telefonico Togliendo gli spazi ed altri eventuali caratteri separatori è possibile eseguire il controllo solo sulle vere cifre che compongono il numero. Questa operazione di pulizia viene effettuata usando la funzione REPLACE(). Se necessario è possibile usare anche più funzioni REPLACE() nidificate.
27 Le funzioni Somma Se e CONCATENA() Combinazione delle funzioni SOMMA(), SE() e CONCATENA().
Il confronto si esegue tra due coppie di valori per rispondere al quesito:
esegui la somma dei valori che si trovano nella colonna F se l'articolo che sta nella colonna C e se il suo colore che è indicato nella colonna D sono uguali all'articolo indicato nella cella C16 e al colore che ho indicato nella cella C17.
28 Le funzioni VAL.ERR e SE In queste formule usiamo ben tre funzioni del foglio di Excel:
la funzione SE
la funzione VAL.ERRORE
la funzione CERCA.VERTICALE

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum