• User Attivo

    Ricerca Full-Text e rilevanza

    Salve a tutti,
    in un database vorrei fare delle ricerche full text ed estrapolare solo quei dati di che sono più simili ad altri dati (se non addirittura uguali).

    Per esempio:
    select id,MATCH(contenuto) AGAINST ('testo' in boolean mode) as relevance FROM tabella having relevance >0.8

    Relevance > 0.8 è un esempio, vorrei estrepolare quei dati che sono più simili possibile a 'testo' e scartare gli altri.

    Il problema, è che relevance mi può balzare da 1 a 200 anche con testi identici.
    Anche prendendo dei contenuti uguali, i valori di relevance dei dati identici a confronto, sono sempre diversi.

    Come posso "tarare" il valore di "relevance" dato dalla ricerca full text? Che range ha "relevance" e come funziona?


  • User Attivo

    Ciao,
    non so dirti il motivo (nel senso che non so se è un bug o se è una cosa voluta e prchè) ma il MATCH...AGAINST in BOOLEAN MODE non restituisce un valore normalizzato tra 0 e 1 come il MATCH...AGAINST, ma valori interi da 0 a ... (non si sa).

    Una possibile soluzione (che puoi trovare in giro per la rete) e che funziona nel 99% dei casi è questa:

    
    SELECT id,MATCH(contenuto) AGAINST ('testo') AS relevance FROM tabella WHERE MATCH(contenuto) AGAINST ('testo' in IN BOOLEAN MODE) HAVING relevance>0.8
    
    

    Ale


  • User Attivo

    Ciao Magicale,
    niente da fare, è la stessa cosa.
    Ilrange di Relevance va da 0,000 etc... ad oltre 200,000 (per testi identici)..

    Spulciando in questi giorni, ho letto però che il valore di rilevanza non può essere preso in termini assoluti, ma serve da confronto per le varie tuple(ho capito male?)
    Oppure è una qualche impostazione del mio db?


  • User Attivo

    Ciao,
    nella risposta precedente sono andato a memoria e ho scritto una c... riguardo il valore "normalizzato tra 0 e 1". Insomma, la memoria mi ha fatto cilecca.

    Faccio un pò di ricerca nei vecchi appunti e nelle vecchie query usate e ti faccio sapere appena h un attimo.


  • User Attivo

    Grazie mille, mi faresti un vero piacere.

    Comunque penso di essere vicino ad una soluzione accettabile.
    Io ho necessità di verificare che un dato testo non sia duplicato all'interno del DB (anche con piccole modifiche).

    Penso di muovermi in questo modo:
    Effettuo una query per estrapolare le la rilevanza più alta e la confronto con la media di tutte le rilevanze.
    Se la prima è almeno il doppio rispetto la media, vuol dire con buona probabilità che il testo della prima rilevanza è molto simile al testo da comparare dato nella query o addirittura uguale identico.
    Ovviamente i controlli verranno fatti manualmente per verificare i testi, ma questa soluzione potrebbe fungere da spia.