Suchfunktion Problem

pegolino

Mitglied
hallo Forum,
habe schon hier im Forum gesucht, aber keine passende Lösung gefunden. Auf meiner HP habe ich eine Suchfunktion, die klappt auch gut, allerdings gibt es ein Problem. Wenn ich z.B. suche nach bueno shop wird die Adresse 2x gelistet. Einmal unter bueno und anschließend unter shop. Habe schon probiert das zu ändern, aber ich kriege es nicht hin. Bei Sucheingabe buenoshop, also ohne Leertaste funktioniert es.
Hier mal das Script in den wesentlichen Teilen.

//jedes einzelne Suchwort ausgeben
if ($items != 0) {
for($x=0; $x<$items; $x++) {
$n = $x + 0;
echo " <b>$n. Suchwort: $suchteile[$x] </b> <br>";

//Datensätze in denen das gesuchte Wort ($suche) vorkommt; % = unbekannte Zeichen
$abfrage = "SELECT * FROM shop_internet
WHERE lower(kategorie) LIKE '%$suchteile[$x]%' OR lower(name) LIKE '%$suchteile[$x]%'
OR lower(ort) LIKE '%$suchteile[$x]%'";
$ergebnis = mysql_query($abfrage);

echo '<table id="tab1" width="750" border="0">';

while($row = mysql_fetch_object($ergebnis))

Hat da jemand eine Lösung für mich ? Wäre schön.
Gruß Peter
 
Zu allererst solltest du das mal dein Skript in die entsprechenden UBB-Tags setzen: entweder [PHP] ... [/PHP] oder [code=php] ... [/code].

Ansonsten wäre es interessant zu wissen, wie die Datensätze aussehen, die du ausliest. Vielleicht kann man daraus das Problem erkennen.
 
danke für die schnelle Antwort. Die UBB Tags habe ich, das ist ja nur ein kleiner Auszug. Meinst Du mit den Datensätzen die Formatierungen der DB Einträge ? Soll ich einen Screenshot von der DB Struktur posten ?
 
Du sollst den Code, den du hier postest, in diese Tags setzen, damit man ihn besser lesen kann:

PHP:
echo "Hallo Welt!";
 
Hey,
ich habe eine KLEINE suchmaschine Programmiert (bin dabei) Kann die mal das Script zeigen:
PHP:
$query = mysql_query($query);
		$numrows = mysql_num_rows($query);
		if ($numrows > 0){
		//Copyright 2010-2011 by Maximilian Koch	
			while ($row = mysql_fetch_assoc($query)){
				$id = $row['id'];
				$title = $row['title'];
				$description = $row['descreption'];
				$keywords = $row['keywords'];
				$link = $row['link'];
				//Copyright 2010-2011 by Maximilian Koch	
				echo "<h2><a href='$link'>$title</a></h2>
				$description<br /><br />";
				
			}
			
		}
		else
			echo "No results found for \"<b>$k</b>\"";

Weiss nicht ob es dir Hielft
 
hallo,
danke Euch beiden. Das mit dem lesbaren script, da hast Du recht, werde ich machen.

thehacker: danke für das script. Habe gestern abend noch in meiner Sammlung ein Script entdeckt. Das probiere ich mal. Wenn es funktioniert melde ich mich und schließe das Thema.
 
Code:
$abfrage = "SELECT * FROM shop_internet
WHERE lower(kategorie) LIKE '%$suchteile[$x]%' OR lower(name) LIKE '%$suchteile[$x]%'
OR lower(ort) LIKE '%$suchteile[$x]%'";

das wird ziemlich langsam werden, weil das läut komplett an jedem index vorbei.

Du solltest dir überlegen ob du nicht für solche sachen besser geeignete technologien wie Sphinx (http://sphinxsearch.com/) einsetzen willst.
Das ist ne applikation die von leuten entwickelt wird, die den grossteil ihrer freizeit nichts anderes machen, als sich mit volltext-suchen beschäftigen.

Hier die docu der PHP API dazu:
http://php.net/manual/en/book.sphinx.php
 
danke für die Hinweise. Habe mir die Seiten angesehn. Da komme ich nicht klar mit. Bin Laie, und in meinem Alter damit noch anfangen ? Lieber lerne ich noch PHP.

Aber bei meinem Problem gäbe es da nicht die Möglichkeit bei Eingabe des Suchwortes die Leertaste zu unterdrücken, bzw. ignorieren.****?
Das also in der Suchfunktion nicht "bueno shop", sondern "buenoshop" ankommt.
Ich google schon nach solch einer Funktion, bisher aber nix gefunden.
 
An sich ist sphinx relativ leicht einzurichten. Erfordert nur leider, dass man einen server hat wo man den sphinx deamon laufen lassen kann.

Aber gut, wie du willst.

Leerzeichen entfernen ist einfach.
PHP:
echo str_replace(" ", "", "text mit leerzeichen");

Aber verlierst dadurch halt ne grosse menge an flexibilität.

Ich würde an deiner stelle als alternative zu Sphinx Full Text indexe auf der datenbank verwenden.

Ich gehe davon aus dass du MySQL Verwendest:

demo tabelle + daten:
SQL:
CREATE TABLE testdata (
id INT NOT NULL PRIMARY KEY auto_increment,
postdata TEXT NOT NULL,
FULLTEXT INDEX postdata (postdata)
) ENGINE=MyISAM;

-- testdata
insert into testdata(postdata) values('Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
insert into testdata(postdata) values('Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?');

deine abfrage muss dann so aussehen:
SQL:
select * from testdata where match(postdata) AGAINST('adipisicing voluptatem' IN BOOLEAN MODE);

Du kannst auch such operationen angeben. z.B.
SQL:
select * from testdata where match(postdata) AGAINST('+adipisicing +commodo' IN BOOLEAN MODE);

Ein vorgestelltes + bedeutet MUSS vorkommen
ein vorgestelltes - bedeutet DARF NICHT vorkommen
kein prefix bedeutet OPTIONAL vorkommend

die genauen bedeutungen der prefixes und den such syntax findest du im mysql handbuch
http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

WICHTIG:
das ganze funktioniert nur mit MyISAM tables, und nur wenn auf der spalte in der du suchen willst ein FULLTEXT INDEX vorhanden ist.
 
hallo chibisuke,
Du hast Dir ja mächtig Arbeit gemacht. Ich danke Dir.
Werde das mal versuchen und melde mich ob es funktioniert. Kann ein bisschen dauern.
 
Zurück