[PHP/MySQL] Datenbankabfrage mit mehreren Worten

Wert

Member
28 Juli 2009
10
0
Hi,

Ich brauche nochmal eure Hilfe (ihr könnt das so gut :biggrin:).
Also, es existiert für mich derzeit eine Barriere, die ich alleine nicht überwinden kann, ich erkläre kurz mein Script:

Es existiert ein Eingabefeld, in das kann ein Suchwort eingegeben werden, oder auch 2, oder auch 3, oder mehr - eben wie bei Google und Co.

Um Ergebnisse zu finden nutze ich dann folgenden Query:

Code:
mysql_query("SELECT * FROM x WHERE (sprache='english' OR sprache='deutsch') AND ([B]text like '%".$eingabe."%' OR tags like '%".$eingabe."%' OR titel like '%".$eingabe."%' OR url like '%".$eingabe."%' OR id like '%".$eingabe."%')[/B] ORDER BY id DESC LIMIT $anz, 10") or die (mysql_error());

Wichtig ist der dickgedruckte Teil.
Das funktioniert bisher wunderbar, es werden Ergebnisse angezeigt, jedoch nur solange nur ein Suchwort verwendet wird.

Zum Beispiel suche ich nach
"gold" -> ein Ergebniss hat den Titel: Learn to make Euro one cent goldcoin

Das Wort gold wird fettgedruckt und unterstrichen, da es ein Treffer mit dem Suchbegriff darstellt.
In diesem Titel kommt jedoch auch das Wort Euro vor, wenn der Suchbegriff nun:
"euro gold" ist -> kommen garkeine Ergebnisse, obwohl "Learn to make Euro one cent goldcoin" den Begriff "euro" sowie "gold" enthält.


Wie kann ich nun machen, dass es so behandelt wird, dass wenn die Suchwörter vorkommen, egal in welcher Kombination, der Datensatz ausgegeben wird?


Und vielleicht noch erweiternd:
Wie kann ich einbauen, dass, auch wenn nur einer der beiden Begriffe auf einen Datensatz zutrifft, dieser auch ausgegeben wird, jedoch weiter hinten? Also anderen Datensätzen, in denen beide Begriffe vorkommen sollen vorne stehen, die Datensätze, in denen nur eines vorkommt, soll auch ausgegeben werden, jedoch weiter hinten.

Ich weis das das zweite wahrscheinlich schwer ist, weil es etwas mit Relevanzsuche zutun hat, jedoch denke ich, dass mir hier sogut wie am besten geholfen werden kann! :)

Vielen vielen Dank!
 
Unglaublich, ist ja wirklich total einfach :biggrin:

Jetzt muss ich nur noch schauen, dass ich das über mehrere Spalten hinbekomme. Reicht es da diesen Volltext einfach über mehrere Spalten zu legen? Also einen über alle, nicht jede Spalte einzelnd? (Hab ich so beim Googlen aufgeschnappt).

Ja, hat sich bestätigt, über alle einen Index legen (zusammen) und dann per
Code:
MATCH (spalte1, spalte2, spalte3) AGAINST ('".$eingabe."')
abfragen!

Kurze Frage noch: Kann ich bei der Volltextsuche dem Script anweisen, dass die Relevanz der Treffer aus der Spalte url (nur als Beispiel) höher gewichtet wird als die aus allen anderen Spalten?

Oder muss ich dazu soetwas machen:
https://www.phpbar.de/w/Volltextsuche

Zugegeben, der Text hat mich etwas überrumpelt, so ist die Einschätzung meines Kenntnisstandes von Fortgeschrittener auf Anfänger-Amateur zurückgefallen :ugly:

Gruß Wert.
 
Zuletzt bearbeitet:
Wo wir gerade bei der Suche sind... ich nutze folgendes:

Beispiel:
Code:
SELECT vote,votes,befehl,time,name,seo,euro,prozent,beschreibung FROM aktionen WHERE MATCH (name,befehl,beschreibung) AGAINST ("Gewinn" IN BOOLEAN MODE

Diese Abfrage findet eine Aktion mit dem Titel "iPhone Gewinnspiel" nicht wenn ich nach Gewinnspiel suche findet der Query das allerdings. :roll: Was kann man dagegen machen?
 
Die Aussage ist jetzt nicht verbindlich, aber gestern bei meiner Einarbeitungsaktion in die Volltextsuche habe ich gelesen, dass MySQL mit Wortstämmen noch nicht umgehen kann, also eine Suche nach "Freund" findet nicht das Wort "Freundesstamm".

Bei mir ist das genau so: Wenn ich nach "gold" suche findet er "goldcoin" nicht...

Ich hoffe, dass die Aussage sich eventuell auf eine ältere MySQL Verison bezieht, sodass man das doch realisieren kann, denn für mich wäre das auch wunderschön wenn das doch gehen würde :biggrin:

PS: Danke an ice-breaker für deine Hilfe.
 
Nein, das bezieht sich nicht auf eine ältere MySQL-Version sondern ist richtig.
Wenn man nach Gewinn sucht, suche ich ja nicht nach Gewinnspielen sondern "Gewinnen".