Visualizzazione risultati 1 fino 6 di 6

Discussione: Motore di ricerca in tutto il sito creato

  1. #1
    Guest

    Predefinito Motore di ricerca in tutto il sito creato

    ciao gente.
    ho creato, sfruttando una guida su HTML.it un semplice motore di ricerca che usa FULLTEXT.
    ora vorrei creare un motore che cerchi in tutte le tabelle del sito e non solo nella tabella specifica:

    Codice PHP:

    $testo
    = $_POST['testo_search'];
    $testo_sep = explode(" ", $testo);
    for(
    $i = 0; $i < count($testo_sep); $i ++){
    $testo_2 = $testo_sep[$i]." AND ".$testo_2;
    }
    $testo = $testo_2;
    $criterio = "(".$_POST['cerca'].")";
    $q = "SELECT titolo as tit, recensione as rec, id_libro as lid, MATCH $criterio AGAINST('$testo' IN BOOLEAN MODE) as score
    FROM libri
    WHERE MATCH(titolo, recensione) AGAINST('
    $testo' IN BOOLEAN MODE)
    ORDER BY score DESC"
    ;
    come modifico questo script per farlo cercare nei campi FULLTEXT di TUTTE le tabelle?

    da quanto avevo capito, score è un risultato interno della query attraverso cui mysql stabilisce la vicinanza o meno dei risultati della ricerca.
    il problema è che ricevo sempre score=1.
    è un problema perchè vorrei porre vicino ai risultati una percentuale... ma così sarebbe sempre 100% :(

    grazie

    ciao ciao
    Ultima modifica di lsdforum : 06-03-2007 alle ore 15.10.18

  2. #2
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Trovi in questa pagina (http://dev.mysql.com/doc/refman/4.1/...xt-search.html) una spiegazione delle funzioni di ricerca che hai usato e, soprattutto, come mostrare un punteggio ai record che trovi. Il problema è che però il risultato può anche essere maggiore di 1, quindi:
    - o quando stampi i dati consideri valori maggiori di 1 come 1, quindi con rilevanza 100%
    - oppure rapporti i risultati a quello più grande, in modo che quello che stia in cima (e soltanto quello) abbia rilevanza 100%, e quelli successivi rilevanza minore

    In entrambi i casi, però, rischi di generare percentuali un pochino "falsate"...

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  3. #3
    Guest

    Predefinito

    grazie per la risposta, ma da quell'articolo non sono riuscito a capire bene delle cose.
    non c'è scritto come ricercare in piu tabelle, ne come viene gestito lo scoring dei risultati :(

    altri suggerimenti su dove andare a cercare?

    grazie.

    PS: ad ogni modo ho modificato leggermente la funzione come segue:
    Codice PHP:
    for($i = 0; $i < count($testo_sep); $i ++){
    $testo_2 = $testo_2." + ".$testo_sep[$i];
    }
    in modo da avere non AND, ma +...
    infatti mi sono accorto di aver sbagliato sintassi, visto che nelle ricerca bisogna scrivere +parola +che +si +vuole :) e non AND...
    il problema è che il sistema mi pare molto poco flessibile: o trova moltissimi record, ma lo score no funziona (sta sempre ad 1), oppure ne trova pochissimi (non mostrando gli altri) mantenendo sempre lo score ad 1...
    certo è che il sito locale contiene pochi messaggi, poco testo, per cui non so quanto possa essere affidabile il test, malgrado questo, il dubbio sullo score resta..

    che mi consigliavi di fare?
    uno score >=1 diventa 100%
    il resto è (score*100)%?
    intendevi questo?

    grazie.
    Ultima modifica di lsdforum : 07-03-2007 alle ore 12.29.21

  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Citazione Originalmente inviato da lsdforum
    grazie per la risposta, ma da quell'articolo non sono riuscito a capire bene delle cose.
    non c'è scritto come ricercare in piu tabelle, ne come viene gestito lo scoring dei risultati :(
    Posso chiederti che motivo avresti per cercare dei dati su più tabelle? Se hai organizzato bene i dati nel DB, dovresti cavartela con una sola... in caso contrario, prova a ripetere la query su tutte le possibili tabelle...
    Citazione Originalmente inviato da lsdforum
    che mi consigliavi di fare?
    uno score >=1 diventa 100%
    il resto è (score*100)%?
    intendevi questo?

    grazie.
    Se optavi per la prima soluzione, tutti i punteggi maggiori di 1 venivano tradotti con 100%, quelli tra 0 e 1 tradotti con una percentuale tra 0% e 100% (moltiplicando per 100 lo score) e quelli minori di 0 (se presenti) con 0%. Però, visto che dici di ottenere SOLO risultati maggiori di 1, saranno tutti formattati con 100% e non penso che ti vada bene...

    La seconda soluzione consisteva in questo: determinavi prima quale fosse il risultato più rilevante della tua ricerca (piuttosto facile, se scrivi la query in modo da ordinare i risultati in ordine decrescente con ORDER BY score DESC). Poi rapportavi tutti gli score che hai trovato a quello più grande: ottieni così 100% soltanto per il record più "rilevante" (o più di uno nel caso ci fosse pari rilevanza), e una percentuale descrescente per gli altri record. In altre parole, usando uno degli esempi riportati sul link sopra, calcoli così il rank:
    Codice:
    +----+-------------------------------------+-----------------+--------------------+
    | id | body                                | score           | rank               |
    +----+-------------------------------------+-----------------+--------------------+
    |  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 | 100% = 1.52 / 1.52 |
    |  6 | When configured properly, MySQL ... | 1.3114095926285 | 86% = 1.31 / 1.52  |
    +----+-------------------------------------+-----------------+--------------------+
    L'inconveniente di questo metodo è però che se vengono trovati pochi record, e tutti hanno poco a che vedere con la query che hai scritto, quello più rilevante avrà sempre valore 100%...

    Stammi bene...
    Ultima modifica di dementialsite : 07-03-2007 alle ore 12.37.50
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    Guest

    Predefinito

    in risposta alla tua domanda.. ho semplicemente piu tabelle.
    mentre il motore di ricerca che ti ho segnalato cerca nella tabella "libri", visto che ho molteplici sezioni nel sito ognuna dedicata a qualcosa di diverso, per evitare di rallentare troppo il database e di appesantirlo, ho creato tabelle separate.
    ecco perchè, nell'home page vorrei mettere uno stupidissimo "motorino" ;) che cerchi ovunque.
    non volevo ripetere la query per ogni tabella solo per evitare di sprecare query... :)

    riguardo allo score, grazie per la delucidazione.
    mi sono risolto ad agire così:

    Codice PHP:
    ...
    $cont = 0; //validerà se è il primo record o meno.
    ...
    while(
    $row = mysql_fetch_array($q2)){
    if(
    $cont == 0){ //allora è il primo record e visto che ORDER è DESC sallora sarà anche lo score piu alto
    $max = $row['score'];
    $cont = 1; //il primo record è stato computato...
    }
    $perc = round(($row['score'] / $max)*100,2);
    $perc = $perc."%";
    che ne pensi?
    grazie di tutto.

  6. #6
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Non so suggerirti il modo per non sprecare query, mi viene in mente che in SQL puro potresti unire le tabelle (non con il JOIN ma con UNION), ma non credo che sia un'operazione supportata dall'implementazione di MySQL.

    Quanto al codice che hai scritto, e' esattamente (a meno dell'approssimazione a 2 decimali) l'implementazione di quanto ti ho detto sopra (il secondo metodo). Controlla soltanto che la variabile $max resti definita senza che ne cambi il valore, o potresti ricevere dei risultati sbagliati o degli errori di elaborazione (non trovando un valore per $max potrebbe prenderti zero e, sai com'e', la divisione per zero non e' permessa...). Se ci fossero problemi, ti basta inserire un "inutile" $max = 0; al di fuori (prima) del ciclo.

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •