Seite 1 von 2

Schutz vor Doppeleinträgen, Volltext-Such Hilfe...

Verfasst: 09.11.2007 23:33
von terminatorx120
Hi,
Hat jemand eine Idee, dass EInhalte nicht doppelt angezeigt werden?
Es ist für ein Such-Skript!

Code: Alles auswählen

$searchwords = explode(" ", $_POST['s']);

$i = 0;
$count = count($searchwords);

$show = '<table width="780">';
while($i < $count){

  $sql_s = "SELECT *
FROM ".$table_prefix."video
WHERE titel LIKE CONVERT( _utf8 '%".$searchwords[$i]."%'
USING latin1 )
COLLATE latin1_swedish_ci
OR game LIKE CONVERT( _utf8 '%".$searchwords[$i]."%'
USING latin1 )
COLLATE latin1_swedish_ci
OR beschreibung LIKE CONVERT( _utf8 '%".$searchwords[$i]."%'
USING latin1 )
COLLATE latin1_swedish_ci";
  $array = 'titel';
  $array_id = 'id';
echo $sql_s;
  if (!($result = mysql_query($sql_s))){
       message_die(CRITICAL_ERROR, "Konnte Querrie auf Allgemeine Video-tabelle nicht ausf&uuml;hren!<br><br>Could not querrie video information!", "", __LINE__, __FILE__, $sql);
  } 
  while ($s_row = mysql_fetch_assoc($result)){
 //Zeigt noch Doppelt an!
    $show .= '<tr><td style="text-align:left" class="row1"><strong><a href="http://www.keepgaming.de/video/'.$s_row['video_id'].'">'.$s_row['titel'].'</a></strong><br />'.kurzTitel($s_row['beschreibung'], 200).'<br /><td></tr>';
  
}   
$i++;
}
Danke

Verfasst: 10.11.2007 01:30
von Pyramide
Wenn du für jeden Suchbegriff eine neue Anfrage startest, ist es nicht zu vermeiden, daß manche Einträge in beiden Abfragen vorkommen.

Ich würde dir empfehlen, die Full-Text Search Functions zu nutzen.

Verfasst: 10.11.2007 15:07
von terminatorx120
So ungefähr??

Code: Alles auswählen

$sql_s = "SELECT *, MATCH (titel,beschreibung) AGAINST ('SUCHWÖRTER')
        FROM 
".$table_prefix."video";
Könntet jemand sonst eine direkte Verbesserung vornehmen?
Wäre super!

Danke

EDIT:

Ich glaube ich habe es:

Code: Alles auswählen

SELECT *
FROM TABLE_PREFIXvideo
WHERE MATCH (
titel, beschreibung
)
AGAINST (
'"WORT1" "WORT2"'
IN BOOLEAN
MODE
)

Verfasst: 10.11.2007 15:14
von Pyramide
Das MATCH muss noch ins WHERE, da du ja warscheinlich nur die Einträge haben willst, in denen die Suchergebnisse auch vorkommen. Dann kannst du noch nach der Relevanz sortieren, damit die besten Suchergebnisse an erster Stelle stehen. Und Select * is evil

Code: Alles auswählen

SELECT id, titel, beschreibung, ..., MATCH (titel,beschreibung) AGAINST ('SUCHWÖRTER') AS relevanz
FROM {$table_prefix}video
WHERE MATCH (titel, beschreibung) AGAINST ('SUCHWÖRTER')
ORDER BY relevanz DESC

Verfasst: 10.11.2007 15:17
von terminatorx120
Oh, da hast du geschrieben, als ich gerade meinen bearbeitet habe.

Wie meinste das genau mit der Relevanz?

Ich habe nun mal eine TEST-Abfrage gemacht und bekomme dies:
SELECT id, titel, beschreibung
MATCH (
titel, beschreibung
)
AGAINST (
'Crysis'
) AS relevanz
FROM kg_video
WHERE MATCH (
titel, beschreibung
)
AGAINST (
'Crysis'
)
ORDER BY relevanz DESC
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MATCH ( titel , beschreibung ) AGAINST ( 'Crysis' ) AS relevanz FROM kg_video ' at line 1
Danke!

Verfasst: 10.11.2007 15:32
von Pyramide
Da fehlt ein Komma :roll:

Verfasst: 10.11.2007 15:37
von terminatorx120
Wo, hinter beschreibung?

Als ich da eines gesetzt habe, kam diese Meldung:

Code: Alles auswählen

#1191 - Can't find FULLTEXT index matching the column list 





Ich habe jetzt fast alles, nur keine Relevanz:

Code: Alles auswählen

$searchwords = explode(" ", $_POST['s']);

$i = 0;
$count = count($searchwords);
$search = "";
$show = '<table width="780">';
while($i < $count){

if ($count <= 1 && $i == 0){
$search = '"'.$searchwords[$i].'"';
}
else{
$search .= ', "'.$searchwords[$i].'"';
}
$i++;
}
  $sql_s = "SELECT *
FROM ".$table_prefix."video
WHERE MATCH (
titel, beschreibung
)
AGAINST (
'$search'
IN BOOLEAN
MODE
)";
  $array = 'titel';
  $array_id = 'id';
echo $sql_s;
  if (!($result = mysql_query($sql_s))){
       message_die(CRITICAL_ERROR, "Konnte Querrie auf Allgemeine Video-tabelle nicht ausf&uuml;hren!<br><br>Could not querrie video information!", "", __LINE__, __FILE__, $sql);
  } 
  while ($s_row = mysql_fetch_assoc($result)){
 //Zeigt noch Doppelt an!
    $show .= '<tr><td style="text-align:left" class="row1"><strong><a href="http://www.keepgaming.de/video/'.$s_row['video_id'].'">'.$s_row['titel'].'</a></strong><br />'.kurzTitel($s_row['beschreibung'], 200).'<br /><td></tr>';
  
}   

$gesamt = mysql_num_rows($result);

$show .= '</table>';
"kurzText($string, $limit)" verhindert übrigens, dass die Beschreibung zu lang ist!

Verfasst: 11.11.2007 12:59
von terminatorx120
Keiner eine Idee??

Verfasst: 11.11.2007 14:20
von Pyramide
Du musst den Index für genau die Spalten erstellen, in denen du suchst, sonst funktioniert es nicht.

Verfasst: 11.11.2007 21:44
von terminatorx120
Ein wenig Konkreter, bitte.
Ich habe eigentlich schon alles getestet...

Ich habe es nun so verstanden:

Ich muss im Select die Row genau angeben:
SELECT titel, beschreibung, game

Oder wie sonst??

Bitte, wenn möglich auch direkten Beispiel Code geben... :wink: