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

    [mysql] motore di ricerca: regexp o fulltext?

    Ciao amici!

    Sto costruendo un mio motorino di ricerca.
    Fino adesso, ho utilizzato le regexp per trovare le parole nel campo DESCRIPTION:
    codice:
    SELECT * FROM tabella
    WHERE `description` REGEXP '[^A-Za-z]*prova[^A-Za-z]*'
    AND `description` REGEXP '[^A-Za-z]*riprova[^A-Za-z]*'
    OR (`itemtitle` REGEXP '[^A-Za-z]*prova[^A-Za-z]*'
    AND `itemtitle` REGEXP '[^A-Za-z]*riprova[^A-Za-z]*')
    ORDER BY `pubdate` DESC
    Per funzionare funziona (nsomma ), però quando ho provato a ingrandire il db per verificare le prestazioni, mi sono reso conto che una query del genere porta via diversi secondi su un DB da 50mb.

    Poi ho scoperto una cosa chiamata Fulltext (articolo1 articolo2 ). Vorrei sapere da voi: questo tipo di ricerca ha prestazioni migliori rispetto a una query come quella che faccio io con le REGEXP?

    Insomma, me la consigliate oppure no?
    Avete qualche altro buon articolo su fulltext?

    Grazie

  2. #2

    Re: [mysql] motore di ricerca: regexp o fulltext?

    Originariamente inviato da Petro_suse91
    Insomma, me la consigliate oppure no?
    si ma occhio che richiede un certo tipo di tabelle , tipo che non e' sempre presente sui vs on-line e tipo che ha un futuro non molto chiaro da quanto ne so
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3

    Re: Re: [mysql] motore di ricerca: regexp o fulltext?

    Originariamente inviato da andr3a
    si ma occhio che richiede un certo tipo di tabelle , tipo che non e' sempre presente sui vs on-line e tipo che ha un futuro non molto chiaro da quanto ne so
    Grazie andr3a, però...ehm potresti spiegare in modo un po' più esteso per cortesia?

    io ho un db mysql e tabelle MyISAM (quella che mi ha messo di default, ma credo di poterla cambiare se è necessario)
    tu a quale tipo di tabella ti riferisci?

    p.s. "non e' sempre presente sui vs on-line" -> ?

  4. #4

    Re: Re: Re: [mysql] motore di ricerca: regexp o fulltext?

    Originariamente inviato da Petro_suse91
    Grazie andr3a, però...ehm potresti spiegare in modo un po' più esteso per cortesia?
    perdonami , ho detto una grande cacchiata:
    http://dev.mysql.com/doc/refman/5.0/...xt-search.html

    MyISAM ... tutto regolare, parlavo di innoDB , le MyISAM sono le piu' comuni, quindi scusami ancora per la confusione
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    ...sei perdonato

    ora mi leggo la documentazione, faccio le mie prove e poi vi faccio sapere.

    Grazie ancora

  6. #6
    la ricerca con FULLTEXT è sbalorditiva! VVoVe:

    Per dare un'idea: la query che facevo prima, con REGEXP, su un DB da 50mb richiedeva dai 4 ai 17 secondi.
    Con fulltext, una query equivalente su un db da 250mb impiega mezzo secondo, con minimi di 0.33 e un massimo di 2.70, e stiamo parlando di ricerche anche complesse su due campi e 60mila record!!! VVoVe:

    DOMANDA: I tempi quindi sono + che accettabili, ma è ragionevole supporre che se il db occupasse 2.5gb o 25gb invece degli attuali 250mb, i tempi medi sarebbero rispettivamente 30 secondi e 300 secondi, invece dell'attuale mezzo secondo? Oppure non è così che vanno calcolati?

    Comunque, Fulltext oltre alle prestazioni, offre molte semplificazioni:
    1) Le ricerche booleane: le query (parola -altraparola), ("la frase esatta") se le gestisce direttamente SQL, e non devo più fare controlli a mano con PHP
    2) Supporta le Query Extension!!! La qual cosa, lasciatemelo dire, è una Gran Figata!

    Purtroppo però questa ricerca ha un "limite", ovvero: il limite minimo per la parola da cercare è 4 caratteri. Questa impostazione si può cambiare a livello di server sql nei file di configurazione, e richiede un riavvio del server. Cosa che molto difficilmente un qualsiasi hosting permette. Se si vuole bypassare questo limite l'unica è un server dedicato/virtuale o in housing.

    Comunque, FULLTEXT rulla, e di brutto!!!!
    Perchè nessuno me lo ha detto prima?

  7. #7
    Originariamente inviato da Petro_suse91
    Con fulltext, una query equivalente su un db da 250mb impiega mezzo secondo, con minimi di 0.33 e un massimo di 2.70, e stiamo parlando di ricerche anche complesse su due campi e 60mila record!!!
    2 secondi e passa per una sola query sono improponibili per un sistema multi accesso ( sito on-line ), accettabilissimi invece per un' area di amministrazione a singola utenza ... pensa se questo forum impiegasse 2 secondi per ognuno che cerca qualcosa, staremmo minuti ad aspettare una ricerca .. e cosi' non e'.

    Questo per dire che probabilmente non hai una macchina molto veloce perche' secondo me i tempi sarebbero dovuti essere almeno dimezzati ... se invece stai testando in locale vedrai che online le prestazioni saranno migliori

    In ultimo, quando si cerca una parola da meno di 4 caratteri si sta' cercando tutto e niente, quindi penso che un bel LIKE possa essere piu' che sufficiente ...


    WHERE campo LIKE '% $parola %' OR campo LIKE '$paola %' OR campo LIKE '% $parola'

    e se non trova che scrivesse qualcosa di piu' consistente da cercare

    ( poi ci sono casi dedicati, su un sito di programmazione dovresti permettere di cercare anche C ... per intenderci )

    ci fai sapere come hai risolto ed i tempi di risposta per i campi con meno di 4 lettere ? grazie
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Ciao Andr3a!
    Effettivamente i tempi sono alti (e neanche costanti) perchè sto lavorando sul mio pc, che pur essendo abb. potente (P4@3Ghz, 512ram) non è un server.
    Infatti sta girando winxp, con una dozzina di applicazioni aperte, e il server è... easyphp

    Forse ciò spiega anche il fatto che per la stessa query a volte ci mette 2 secondi e a volte 12

    Sono sicuro che su un server linux dedicato a mysql con una installazione "pulita" per fare solo quello, il discorso cambia e non poco! Ma tanto per ora mi basta vedere se funziona

    La ricerca con parole di 3 caratteri l'avrei anche provata... se easyphp non fosse così cacoso (mi ferma il server mysql senza possibilità di riavvio se tento di cambiare configurazione, ma anche ogni volta che riavvio il pc)
    Comunque ora installo un apache+php+mysql "puliti" e butto via easyphp. Poi ti faccio sapere

    Infine, mi rimangono tre dubbi:
    1) Se dovessi cercare le parole di 3 lettere con LIKE, non sfrutterei gli indici fulltext e quindi la query sarebbe MOLTO onerosa, o mi sbaglio?
    2)
    DOMANDA: I tempi quindi sono + che accettabili, ma è ragionevole supporre che se il db occupasse 2.5gb o 25gb invece degli attuali 250mb, i tempi medi sarebbero rispettivamente 30 secondi e 300 secondi, invece dell'attuale mezzo secondo? Oppure non è così che vanno calcolati?
    3) Se installo mysql a parte, è compreso phpmyadmin?

    e grazie x l'interessamento

  9. #9
    Allora, eccomi qui a tirar le somme.
    Purtroppo i dati che ho sottomano non sono molto attendibili, a causa della macchina che uso.
    Ho tolto easyphp e ho installato Apache2, PHP 4.4.1 e MySQL 4.4.1 sul mio pc con Windows XP, ma evidentemente non è affidabile per DB di grosse dimensioni: con 200.000 record e 1GB di database, per la stessa query ci mette una volta 40 secondi, poi 6, poi 20 e poi 2.
    Quando il DB era 250mega le cose andavano NETTAMENTE meglio (vedi post poco più su).

    Sicuramente dipende dal fatto che il pc è usato anche per altre cose, e che il disco è in realtà una partizione dati + windows su un hd da 5400rpm ATA.

    Comunque... per quel che ho potuto riscontrare, impostando il limite minimo a 3 caratteri le prestazioni non subiscono un degrado apprezzabile. Quando potrò mettere tutto l'ambaradan su un server "vero", allora potrò sciorinare dati con cognizione di causa.
    Nel frattempo, mi costruisco un sistema di statistiche che tenga traccia del tempo utilizzato per ogni query in relazione al numero di record del DB.

    Nel frattempo, restano aperte le mie domande:
    1) Se dovessi cercare le parole di 3 lettere con LIKE, non sfrutterei gli indici fulltext e quindi la query sarebbe MOLTO onerosa, o mi sbaglio?

    2)I tempi quindi sono + che accettabili, ma è ragionevole supporre che se il db occupasse 2.5gb o 25gb invece degli attuali 250mb, i tempi medi sarebbero rispettivamente 30 secondi e 300 secondi, invece dell'attuale mezzo secondo? Oppure non è così che vanno calcolati?
    Resta il fatto che tra FULLTEXT e REGEXP non esiste il paragone! VVoVe:

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.