Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [MYSQL-FULLTEXT] cercare in due campi separati

    Ho una tabella molto grossa (+ di 500.000 campi circa 400 MB)con vari campi tra cui due dove effettuo la ricerca con fulltext (i due indici sono stati creati separatamente)
    questa è la tabella
    codice:
    id  | nome | descrizione
    Io vorrei cercare o solo in nome o solo in cognome o in entrambi ordinando però per lo score prima di nome e poi di descrizione.

    Ad esempio:
    codice:
    SELECT nome,descrizione,MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score FROM tabella WHERE MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) ORDER BY score DESC;
    La query funziona egregiamente e tempi di esecuzione bassissimi (0,01xxx)
    Stessa cosa con
    codice:
    SELECT nome,descrizione,MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score FROM tabella WHERE MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) ORDER BY score DESC;
    Anche qui la query sopra riportata funziona

    --------
    codice:
    SELECT nome,descrizione,MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score_nome,MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score_descrizione FROM tabella WHERE MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) AND  MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE)  ORDER BY score_nome DESC,score_descrizione DESC;
    Questa funziona bene in terrmini di velocità ma limita i risultati, perche' i valori devono essere giustamente sia in 'nome' sia in 'descrizione' quindi la scarto e faccio
    codice:
    SELECT nome,descrizione,MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score_nome,MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score_descrizione FROM tabella WHERE MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) OR  MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE)  ORDER BY score_nome DESC,score_descrizione DESC;
    Ecco qui l'inghippo, la query impiega anche 15 secondi per eseguirla anche con la query cosi modificata
    codice:
    SELECT nome,descrizione,MATCH (nome,descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score FROM tabella WHERE MATCH (nome,descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) ORDER BY score DESC;
    -----
    Ho provato a fare anche un indice che comprendesse sia nome che descrizione ma phpmyadmin mi avverte che nome è già una chiave fulltext (...e descrizione??? )

    Non capisco......

    PS. Se faccio un indice aggregando nome,descrizione se effettuo l'ultima ricerca funziona alla grande....
    Chi mi puo' aiutare?
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  2. #2

    Re: [MYSQL-FULLTEXT] cercare in due campi separati

    Originariamente inviato da sanbiv
    Ho provato a fare anche un indice che comprendesse sia nome che descrizione ma phpmyadmin mi avverte che nome è già una chiave fulltext (...e descrizione??? )

    Non capisco......

    PS. Se faccio un indice aggregando nome,descrizione se effettuo l'ultima ricerca funziona alla grande....
    Chi mi puo' aiutare?
    se funziona alla grande dov'e' il problema?

    Se vuoi cambiare un indice fulltext lo devi prima rimuovere. ma dal tuo P.S. si direbbe che lo hai fatto.


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

  3. #3
    il problema è che io vorrei ordinare per attinenza prima nome e poi descrizione, mi spiego se ho ad esempio:
    codice:
    id | nome | descrizione
    1 | auricolare | Auricolare compatibile per nokia n93.
    2 | nokia n93 | telefono cellulare
    Effetturando la ricerca io vorrei che nei risultati per primi ci fossero gli articoli che nel nome contengono i campi di ricerca e poi nella descrizione, invece usando i due indici aggregati la ricerca non tiene conto di cio'.... come posso fare?
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  4. #4
    non saprei che dirti.

    nell'esempio che porti verrebbe comunque nel nome prima "auricolare" e poi Nokia.

    Fai due query oppure una UNION. nella prima select cerchi il nome e nella union la descrizione, su due indici fultext separati (ovviamente).

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

  5. #5
    UNION ---- ma come faccio a sommare i due risultati evitando i doppioni?
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  6. #6
    Originariamente inviato da sanbiv
    UNION ---- ma come faccio a sommare i due risultati evitando i doppioni?
    UNION non rende doppioni.

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

  7. #7
    Quindi potrei fare:
    codice:
    SELECT nome,descrizione,MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score_name FROM tabella WHERE MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) ORDER BY score_name DESC
    UNION
    SELECT nome,descrizione,MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score_descr FROM tabella WHERE MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) ORDER BY score_descr DESC
    Ma una cosa non mi è chiara!!!
    Come faccio a fare un LIMIT, dove lo imposto??
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  8. #8
    Originariamente inviato da sanbiv
    Quindi potrei fare:
    Ma una cosa non mi è chiara!!!
    Come faccio a fare un LIMIT, dove lo imposto??
    codice:
    (SELECT nome, descrizione, 
    MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score
    FROM tabella 
    WHERE MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) 
    ORDER BY score DESC
    LIMIT 0, ....)
    UNION
    (SELECT nome, descrizione,
    MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score
    FROM tabella WHERE MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) ORDER BY score DESC
    LIMIT 0, .... )
    occhio a UNION per come fa poi gli ordinamenti. verifica che siano corretti. Usando LIMIT dovresti andare bene. I nomi dei campi sono identici per entrambe le query. Se non va UNION fanne due di queries. Cambia nulla.

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

  9. #9
    Originariamente inviato da piero.mac
    codice:
    (SELECT nome, descrizione, 
    MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score
    FROM tabella 
    WHERE MATCH (nome) AGAINST('+nokia +n93' IN BOOLEAN MODE) 
    ORDER BY score DESC
    LIMIT 0, ....)
    UNION
    (SELECT nome, descrizione,
    MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) as score
    FROM tabella WHERE MATCH (descrizione) AGAINST('+nokia +n93' IN BOOLEAN MODE) ORDER BY score DESC
    LIMIT 0, .... )
    occhio a UNION per come fa poi gli ordinamenti. verifica che siano corretti. Usando LIMIT dovresti andare bene. I nomi dei campi sono identici per entrambe le query. Se non va UNION fanne due di queries. Cambia nulla.
    Scusami piero.mac ma cosi' facendo non estrae ad esempio 30 della prima query altri 30 della seconda e se ci sono doppioni non me ne ritorna piu' 60 ma meno...... boh
    non conviene mettere ad esempio:

    codice:
    (SELECT * FROM tab WHERE condizioni)
    UNION
    (SELECT * FROM tab WHERE condizioni)
    LIMIT 0,30
    è sbagliato questo esempio??
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  10. #10
    Originariamente inviato da sanbiv
    Scusami piero.mac ma cosi' facendo non estrae ad esempio 30 della prima query altri 30 della seconda e se ci sono doppioni non me ne ritorna piu' 60 ma meno...... boh
    non conviene mettere ad esempio:

    codice:
    (SELECT * FROM tab WHERE condizioni)
    UNION
    (SELECT * FROM tab WHERE condizioni)
    LIMIT 0,30
    è sbagliato questo esempio??
    se va bene e' corretto se male non e' corretto..... se vuoi prima un tipo e poi un altro, dovrai prendere prima tutti quelli di un tipo e poi quelli dell'altro. Se non lo sai tu quello che devi fare ....

    hai la tabella hai tutto quello che serve. Prova.

    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 © 2024 vBulletin Solutions, Inc. All rights reserved.