Ricerca fulltext

Premetto che sto utilizzando la versione MySQL 5.0.27 eseguo le seguenti operazioni nel mio db:

  • Creo gli "INDEX" di tipo "FULLTEXT" con la seguente oprerazione:

             ALTER TABLE `tprodotti1`

    ADD FULLTEXT (codice_prodotto, descrizione,serie) ricevendo il seguente messaggioQuery OK, 9 rows affected (661 ms)

  • Creo una select di ricerca:

    SELECT       *     FROM `tprodotti1`    WHERE MATCH (descrizione, serie)    AGAINST ('seduta');

    ma ricevo il seguente messaggio d'errore: can't find FULLTEXT index matching the column list

Dove sbaglio?

grazie giovanni

inviato 9 anni fa
bonann23
X 0 X

Se crei un indice FULLTEXT sul GRUPPO di campi codice_prodotto, descrizione,serie allora puoi fare ricerche su codice_prodotto oppure su odice_prodotto, descrizione oppure codice_prodotto, descrizione,serie

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

non capisco come estrarre i risultati:

$mysql_cerca="";
$mysql_cerca="  SELECT id_prodotto, codice_prodotto, descrizione,serie, finitura,
     MATCH (codice_prodotto, descrizione,serie, finitura)
     AGAINST ('".$_GET["chiave"]."')
     AS new_table
    FROM `tprodotti`
  ORDER BY new_table DESC
   ";
 
  //echo $mysql_cerca;
   $result_cerca = mysql_query($mysql_cerca,$db) or die("Errore");
   $numrows_cerca=mysql_num_rows($result_cerca);
   if ($numrows_cerca>0) {
    while ($myrow_cerca= mysql_fetch_array($result_cerca)) {
echo $myrow_cerca["codice_prodotto"]."<br />";// NON CAPISCO PERCHE' OTTENGO TUTTI I RECORD PRESENTI NELLA TABELLA D'ORIGINE!!!!!!
Grazie Giovanni

}
risposto 9 anni fa
bonann23
X 0 X

dovresti procedere per gradi, facendo la ricerca solo sul primo campo, magari usando phpmyadmin o simili

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

non capisco puoi farmi un esempio?

risposto 9 anni fa
bonann23
X 0 X

in definitiva ottengo un recordset non filtrato ( tutti i record della tabella originaria)!!!!!

risposto 9 anni fa
bonann23
X 0 X

prova a fare query del tipo:

SELECT id_prodotto, codice_prodotto, descrizione,serie, finitura,

     MATCH (codice_prodotto)

     AGAINST ('test')

     AS new_table

    FROM `tprodotti`

  ORDER BY new_table DESC

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

ottengo quest'errore

can't find FULLTEXT index matching the column list

risposto 9 anni fa
bonann23
X 0 X

Annulla il mio ultimo post perchè il mio problema non stà in MySQL ma in PHP :

Infatti la query funziona; ma non riesco a visualizzarne il risultato.

Utilizzo:

while ($myrow_cerca= mysql_fetch_array($result_cerca)){ 
echo $myrow_cerca["codice_prodotto"];
}

ma come ho già detto ottengo tutti i record del recordset.

forse devo cambiare sezione del forum?

grazie

Giovanni

 

risposto 9 anni fa
bonann23
X 0 X

quindi stai dicendo che se esegui la query da PHP ottieni tutte le righe della tabella mentre se la lanci da un  altro programma funziona?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

no il risultato è sempre lo stesso sia da php che da MySQL( tutti i records)

risposto 9 anni fa
bonann23
X 0 X

Ok, mi sono accorto dell'errore...

In pratica la riga "MATCH (codice_prodotto) AGAINST ('test')" restituisce semplicemente un numero da 0 a 1 che rappresenta l'attineza della riga rispetto alla parola cercata. Questo valore è 0 quando non c'è alcuna attinenza.

Nella query che hai usato per ciascuna riga della tabella hai chiesto di mostrarti il grado di attinenza della ricerca ma non hai filtrato nulla.

Un modo per ottenenre solamente le righe che hanno un minimo di attinenza è imporre al condizione che le righe abbiano una attinenza non nulla:

[tt]SELECT

   id_prodotto, codice_prodotto, descrizione,serie, finitura

FROM

   `tprodotti`

WHERE

     MATCH (codice_prodotto) AGAINST ('test')[/tt]

i risultati verranno automaticamente ordinati (in maniera implicita) per attinenza. La WHERE sull'attinenza serve proprio ad escludere i risultati privi di attinenza (attinenza = 0)

 :bye:

   

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

ok benissimo adesso funziona!!!!!!

Ma come tu sai i problemi non finiscono mai.

infatti vorrei ottenere una ricerca sul tipo "Google" dove se cerco ad esempio" casa mia"; ottengo come risultato tutti i records che contengono la parola casa e/o la parola mia.

come devo muovermi?

grazie giovanni

risposto 9 anni fa
bonann23
X 0 X

Ma non funziona già così?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

intanto devo dirti che ho indicizzato tre campi (descrizione, codice_prodotto, serie) e che la query sulla quale lavoro è la seguente:

SELECT id_prodotto, codice_prodotto, descrizione,serie, finitura FROM `tprodotti3` WHERE MATCH (codice_prodotto, descrizione,serie) AGAINST ('test')

il problema è che non riesco ad avere i risultati per "attinenza".

Infatti se cerco un testo composto da due parole la query ignora la seconda parola (es. casa mia) cerca e trova solo la parola "casa"!!!!!

che ne pensi?

grazie Giovanni

risposto 9 anni fa
bonann23
X 0 X

ho inserito la clausola IN BOOLEAN MODE:

quindi al query adesso è:

SELECT *, 
MATCH (codice_prodotto, descrizione,serie) 
AGAINST ('casa mia'IN BOOLEAN MODE) 
AS attinenza 
FROM tprodotti3 
WHERE MATCH (codice_prodotto, descrizione,serie) 
AGAINST ('casa mia' IN BOOLEAN MODE) 
ORDER BY attinenza DESC

purtroppo il risultato non cambia!!!!!!!!

ottengo la ricerca solo su una parola!

giovanni

risposto 9 anni fa
bonann23
X 0 X

quindi hai dei record col la sola parola "mia" e senza "casa" ma non vengono restituiti?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

non capisco; ma con alcune parole la ricerca funziona correttamente ad esempio per la ricercatubo nuovo,  ottengo, come risultati, tutti i record contenenti le due parole, anche singolarmente e su due campi diversi; mentre per la ricerca casa mia non funziona!!!!!!!

a dire il vero non sortisce risultati  neanche per la ricerca dellla sola parola "mia"!!!!

giovanni

risposto 9 anni fa
bonann23
X 0 X

ho postato prima di leggere la tua risposta .

Si come puoi leggere dal mio ultimo post!

grazie giovanni

risposto 9 anni fa
bonann23
X 0 X

come al solito le cose mi ritornano alla mente una alla volta....

La ricerca non funziona con parole di meno di 4 caratteri  :dunno:

Controlla la documentazione ufficiale a riguardo

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Si adesso ricordo d'averlo letto anche io!!!!!

grazie scusami

giovanni

risposto 9 anni fa
bonann23
X 0 X

Se hai accesso alla configurazione di mysql, basta inserire nel my.cnf

ft_min_word_len=3

Tieni anche conto che (non in boolean mode) se una parola è in piu del 50% di record viene automaticamente ignorata, perchè mysql suppone sia una parola non utile ai fini della rilevanza.

Ciao

risposto 9 anni fa
Thesee
X 0 X

Sempre più difficile.

se nella query devo fare anche un filtro per un valore numerico che ricevo da un check?

grazie giovanni

risposto 9 anni fa
bonann23
X 0 X

Aggiungi un AND miocampo = miocheck   prima dell'ORDER BY ;)

Ciao

risposto 9 anni fa
Thesee
X 0 X

ecco la query e l'errore che ricevo

SELECT *, 
MATCH (codice_prodotto, descrizione,serie) 
AGAINST ('nuovo'IN BOOLEAN MODE) AS attinenza 
FROM tprodotti3 
WHERE MATCH (codice_prodotto, descrizione,serie) 
AGAINST ('nuovo' IN BOOLEAN MODE) 
AND tprodotti.offerta=0 
ORDER BY attinenza DESC

ERRORE:unknown column 'tprodotti.offerta' in 'where clause'

preciso che il campo offerta è presente nella tabella tprodotti3

giovanni

risposto 9 anni fa
bonann23
X 0 X

hai detto giusto, la tabella è tprodotti3 e non tprodotti come hai scritto  ;)

cosi è corretta

SELECT *, 
MATCH (codice_prodotto, descrizione,serie) 
AGAINST ('nuovo'IN BOOLEAN MODE) AS attinenza 
FROM tprodotti3 
WHERE MATCH (codice_prodotto, descrizione,serie) 
AGAINST ('nuovo' IN BOOLEAN MODE) 
AND tprodotti3.offerta=0 
ORDER BY attinenza DESC
risposto 9 anni fa
Thesee
X 0 X

ok una distrazione che può costare ore di lavoro!!!!!

vorrei adesso allargare il problema.

Se nella tabella d'origine ho dei campi numerici relazionati con altre tabelle (es. offerte), non posso includere questi parametri nella mia ricerca.

Allora il modo da fare è solo quello di far fare delle scelte preventive all' utente(select, check ecc)?

grazie giovanni

risposto 9 anni fa
bonann23
X 0 X

puoi utilizzare delle join.

ad esempio:

SELECT t3.*, 
MATCH (t3.codice_prodotto, t3.descrizione,serie) 
AGAINST ('nuovo'IN BOOLEAN MODE) AS attinenza 
FROM tprodotti3 t3 LEFT JOIN tabellaofferte tof ON t3.codice_prodotto = tof.codice_prodotto
WHERE MATCH (t3.codice_prodotto, t3.descrizione,serie) 
AGAINST ('nuovo' IN BOOLEAN MODE) 
AND t3.offerta=0 AND tof.prezzo > 100
ORDER BY attinenza DESC

dipende da cosa hai in relazione. In questo esempio cerchi nella tabella tprodotti3 e nella tabella offerte, utilizzando la relazione comune codice_prodotto e in piu filtri per prezzo nella tabella offerte.

risposto 9 anni fa
Thesee
X 0 X

grazie il tuo aiuto è stato preziosissimo.

Domani, di buon ora, metterò  a frutto quanto mi hai suggerito.

grazie

giovanni

risposto 9 anni fa
bonann23
X 0 X

Sto provando ad affinare sempre più la mia ricerca avenzata.

Ho costruito la seguente query:

SELECT *, 
MATCH (modello, descrizione, caratteristiche) 
AGAINST ('ferrero'IN BOOLEAN MODE) AS attinenza, `tarticoli`.idcategoria, `tcase_produttrici`.casa_produttrice, 
`tcategorie`.idsettore, 
`tsettori`.settore 
FROM `tmodelli` 
LEFT OUTER JOIN `tcase_produttrici` ON (`tmodelli`.idcasa_produttrice = `tcase_produttrici`.id_casa_produttrice) 
LEFT OUTER JOIN `tarticoli` ON (`tmodelli`.idarticolo = `tarticoli`.id_articolo) 
LEFT OUTER JOIN `tcategorie` ON (`tarticoli`.idcategoria = `tcategorie`.id_categoria) 
LEFT OUTER JOIN `tsettori` ON (`tcategorie`.idsettore = `tsettori`.id_settore) 
WHERE 
MATCH (modello, descrizione,caratteristiche) AGAINST ('ferrero' IN BOOLEAN MODE) 
AND ((tmodelli.data_cessazione) Is Null) 
ORDER BY attinenza DESC 

Sono stati trovati 29 risultati per casa produttrice ferrero

Ma se faccio una ricerca attraverso la select che mi restituisce il valore "$_POST["idcasa_produttrice"] ottengo un risultato con un maggior numero di record!!!!!!

Allora credo d'aver capito che il problema sta dove faccio la ricerca ; mi spiego meglio nel primo caso (vedi codice) faccio una ricerca attraverso l'indice FULLTEXT, nel secondo, invece, cerco filtando la tabella attaverso il campo idcasa_produtrice. Come posso fare per avere un risultato univoco?

Dovrò forse inserire nei campi di ricerca "FULLTEXT" tutte le informazioni necessarie alla ricerca completa, anche se non necessarie?

Grazie

giovanni

risposto 9 anni fa
bonann23
X 0 X

non ho capito "cerco filtando la tabella attaverso il campo idcasa_produtrice"  ???

che tipo di ricerca fai?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

ecco la query che ottengo attraverso la selezione di una voce da una "select"

SELECT *, 
MATCH (modello, descrizione, caratteristiche) 
AGAINST (''IN BOOLEAN MODE) AS attinenza, 
`tarticoli`.idcategoria, 
`tcase_produttrici`.casa_produttrice, 
`tcategorie`.idsettore, 
`tsettori`.settore 
FROM `tmodelli` 
LEFT OUTER JOIN `tcase_produttrici` ON (`tmodelli`.idcasa_produttrice = `tcase_produttrici`.id_casa_produttrice) 
LEFT OUTER JOIN `tarticoli` ON (`tmodelli`.idarticolo = `tarticoli`.id_articolo) 
LEFT OUTER JOIN `tcategorie` ON (`tarticoli`.idcategoria = `tcategorie`.id_categoria) 
LEFT OUTER JOIN `tsettori` ON (`tcategorie`.idsettore = `tsettori`.id_settore) 
WHERE ((tmodelli.data_cessazione) Is Null) 
AND tmodelli.idcasa_produttrice=30 
ORDER BY attinenza DESC

giovanni

risposto 9 anni fa
bonann23
X 0 X

Sono stati trovati 29 risultati per casa produttrice ferrero

Ma se faccio una ricerca attraverso la select che mi restituisce il valore "$_POST["idcasa_produttrice"] ottengo un risultato con un maggior numero di record!!!!!!

A me sembra una cosa normale.

In un caso l'algoritmo cerca la parola ferrero basandosi sulle regole del "linguaggio naturale", quindi chiaramente qualche record può non uscire fuori quando scrivi ferrero....

Il discorso è: se filtri per idcasa_produttrice, trovi delle righe.

Di queste righe quianti sono sensibili alla ricerca fulltext ferrero? sicuramente non tutte. Ecco perchè trovi meno righe.

Ciao

risposto 9 anni fa
Thesee
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda