semplice motore di ricerca... ma non troppo!

davide1982

Nuovo Utente
14 Giu 2010
26
0
0
Salve a tutti,

sto cercando di creare un semplice motore di ricerca interno per il mio sito. Quello che sono riuscito a fare finora però è un po' troppo semplice e presenta un po' di problemi...
Cliccando sul pulsante 'cerca' si viene indirizzati alla pagina cerca.php (di cui riporto il codice qui sotto).
La ricerca serve per trovare delle 'schede' costituite da un'immagine, un titolo e una descrizione. Vorrei che se vengono scritte una o più parole presenti nel titolo o nella descrizione le schede interessate siano presenti nei risultati, possibilmente in ordine di rilevanza.

- Il problema principale è che se scrivo ad esempio due parole, separate da spazio, ed entrambe le parole compaiono nello stesso record, quel record me lo scriverà due volte...
- non riesco a limitare la ricerca con LIMIT. Se scrivessi una parola che è presente in tutti i risultati per assurdo, mi scrive tutti i risultati, fregandosene del LIMIT. Tanto meno riesco a dare una rilevanza accettabile usando ORDER BY e LIKE.
- non riesco a far accettare i caratteri accentati tra i caratteri ammessi nella ricerca.
- mi fermo qui anche se potrei andare avanti con l'elenco....

Se qualcuno ha voglia e tempo di darmi qualche suggerimento ne sarei davvero molto grato!!
Sarei disposto anche a rifarlo tutto da capo, ma con un senso però, perché così com'è proprio non va.... :(

PHP:
if ($_POST['search']){
if (!empty($_POST['keywords'])) {
$searchStr = $_POST['keywords'];
if (ereg("^[0-9a-zA-Zà-ù,&,'.' ]+$", $searchStr)) {

require ("db/db.php");

print "<div class='risultati'>Risultati della ricerca per \"<b>$searchStr</b>\":</div><br>";
$keys = explode(" ", $searchStr);

for ($x = 0; $x < count($keys); $x++) {
$querystr = "SELECT img,link,numclick,descrizione,ordine FROM totale_tabelle WHERE descrizione = \"$keys[$x]\" OR descrizione LIKE \"%$keys[$x]%\" OR ordine = \"$keys[$x]\" OR ordine LIKE \"%$keys[$x]%\"";

$result = mysql_query($querystr);
if ($frow = mysql_fetch_array($result)) {
$found = true;
do { 

$words = $frow["descrizione"];
$boldwords = str_replace($searchStr,"<b>".$searchStr."</b>",$words);

echo "<div class='grid_8'><div class='screen'>".$frow["img"]."</div><div class='text'><h2>".$frow["link"]."<span class='visite'> &nbsp;- ".$frow["numclick"]." visite</span></h2>".$boldwords."</div></div>"."<br>";
} while ($frow = mysql_fetch_array($result));
}

}
if (!$found) {
print("<div class='risultati'><b>Nessun risultato correlato alla ricerca è stato trovato.</b></div><br>");
}

}
else {
print("<div class='risultati'><br><b>La tua stringa di ricerca contiene caratteri non ammessi.</b></div><br>");
}
}
else {
print("<div class='risultati'><br><b>Devi inserire almeno una parola chiave per effettuare la ricerca.</b></div><br>");
}
}
 
Ciao, per il primo problema puoi usare DISTINCT con SQL in modo da non riptere i risultati.
Tuttavia, ti suggerisco di rivedere a monte la progettazione dello strumento di ricerca.

E' davvero necessario fare query su tutto? Non è possibile creare una tabella indice con le keyword principali e ricercare solo su queste?

Ci sono requisiti specifici?

Ciao, Ciro
 
Dunque, diciamo che i problemi principali gli ho risolti così:

PHP:
$querystr = "SELECT img,link,numclick,descrizione,ordine FROM totale_tabelle WHERE 1=1 ";
for ($x = 0; $x < count($keys); $x++) {
   $querystr .= "and concat( descrizione, ordine ) like \"%$keys[$x]%\"";
}
$querystr .= " limit 20";
$result = mysql_query($querystr);

In questo modo non mi duplica più i risultati e riesco a limitarne il numero con LIMIT.


Ho notato però che non ha molto senso il modo in cui metto in bold, nei risultati di ricerca, le parole chiave cercate:

$words = $frow["descrizione"];
$boldwords = str_replace($searchStr,"<b>".$searchStr."</b>",$words);

Pensavo di aver risolto in modo furbo, ma così mi mette in bold solo quello che è esattamente uguale alla stringa di ricerca. Quindi, per fare un esempio, se cerco le parole "macchine usate", mi restituisce bold per "macchine usate", ma non bold per "macchine" o "usate" da soli.... C'è una soluzione migliore di quella che ho attualmente?
 

Discussioni simili

M
Risposte
0
Visite
1K
HTML e CSS
Membro cancellato 26246
M