• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Sql "LIKE" Abfrage: Übereinstimmendes Wort ausgeben

D

DiVaO

Guest
Hi,

tut mir Leid wenn der Titel nicht eindeutig ist, leider weiß ich nicht, wie ich es besser ausdrücken kann.

Undzwar habe ich eine kleine PHP Suchfunktion gebastelt, die die Stichwörter von Blogeinträgen durchsucht und passende Ergebnisse ausgibt. Ganz vereinfacht:

PHP:
$results = mysql_query("SELECT id, titel, text FROM blog WHERE stichwoerter LIKE '%$suchbegriff%'");

# die stichwörter sehen z.b so aus:   "Microsoft Windows Office Ankündigung"

while($row = mysql_fetch_assoc($results)) {
   echo $row['title']."<br>".$row['text'];
}

Funktioniert einwandfrei und gibt mir das passende Suchergebnis aus. Doch was ich eigentlich haben möchte ist das Stichwort, das "like" dem Suchbegriff ist.
Also das Stichwort, wegem dem der Blogeintrag als Ergebnis angezeigt wird.

Wie bekomme ich das heraus? Ich könnte zwar per regex usw. das Suchwort mit den Stichwörtern vergleichen, aber das würde bestimmt nicht in 100% der Fälle mit dem "LIKE" der SQL Abfrage übereinstimmen.

Vielen Dank und einen schönen Abend.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

sprichts in rätzel und vielleicht ein zwei , zuviel?
Sprichst von Stichwort und Suchbegriff aber im code steht nur id, titel, text, tags und keyword, was meinst?

was möchtest heraus bekommen?
wen ein normale REGEXP macht sind die trefer gleich wie bei like, REGEXP braucht nur länger.

Cheffchen
 
Ich hab es mal etwas eindeutiger gemacht. Wie muss denn eine regex aussehen, die exakt das gleiche Ergebnis bringt wie "LIKE"?

Reguläre Ausdrücke waren noch nie meine Stärke und 100%ig weiß ich auch nicht wie "LIKE" tickt.
Also wenn es keine elegante Lösung gibt, das übereinstimmende Stichwort zu finden, brauche ich wohl etwas Hilfe.

Danke.
 
Hallo,

also Like ist immer besser da schneller, wenn nach ein wort oder wortteil suchst dann ist like das richtige wie ja schon hast.
REGEXP ist nur interessant wenn mehr bedingungen hast wie, nur ganzes wort oder vom anfang oder bestimmte zeichen n1cht oder Grossklein.

In der regel macht die aber sehr selten sin.
und ein REGEXP genau so wie LIKE zu machen ist sogar unsinig/falsch.

Cheffchen
 
Ja schon, aber hier geht es ja nicht darum like mit regex zu vergleichen, sondern wie ich das übereinstimmende Stichwort finde, das die "where" Bedingung erfüllt.
Und dafür suche ich eine Lösung.

Ich erläutere mal kurz wofür ich das überhaupt brauche, das hilft vielleicht bei der Lösung des Problems:

Undzwar werden bei der Suche die gefundenen Blogbeiträge untereinander aufgelistet mit Titel und einem kurzen Ausschnitt vom Text. Und ich möchte gerne, dass unter dem Titel der Satz steht, indem das gesuchte bzw. gefundene Stichwort vorkommt, steht und außerdem das Stichwort markiert ist, damit man sieht wo genau es im Text vorkommt.

Nur dafür muss ich erstmal das Stichwort kennen, das gefunden wurde. Und da ich das Stichwort mit "like" suche, kann sich der Suchbegriff stark vom eigentlichen Stichwort unterscheiden. Deswegen brauche ich nicht nur den Suchbegriff, sondern auch das gefundene Stichwort, um dessen Position im text zu bestimmen. ;)

Beispiel:

Suche nach "jquery". Relevante Blogbeiträge werden ausgegeben:

jQuery 1.9 angekündigt
(...) Im folgenden Beitrag fassen wir die neuen Features von jQuery 1.9 zusammen. (...)

_______________________________________________

Neue Plug-ins im Oktober
(...) Hier zeigen wir Ihnen 20 neue und unglaubliche jQuery Plug-ins. (...)
 
Zuletzt bearbeitet von einem Moderator:
Also das Stichwort, wegem dem der Blogeintrag als Ergebnis angezeigt wird.

Das Stichwort steckt in $suchbegriff. Somit hast Du das Stichwort bereits in deiner Abfrage.

Wenn es dir darum geht das Stichwort in den Suchergebnissen hervorzuheben, kannst Du das völlig unabhängig von MySQL mit PHP machen:

PHP:
echo str_replace($suchbegriff, "<strong>".$suchbegriff."</strong>", $row["text"];
 
Hallo,

genau aber anstelle str_replace würde ich vielleicht str_ireplace nehmen da SQL LIKE groß/klein egal ist.

Da sieht man mal wieder was doch eine richtige fragestellung so aus macht :O).

Cheffchen
 
Ja schon, nur das Problem ist doch, dass sich der eingegebene Suchbegriff teilweise stark vom Stichwort unterscheidet. Wenn ich nach "jquer" suche, erhalte ich ja auch Einträge mit dem Stichwort "jQuery 1.9". Da nützt mir doch ein einfaches str_replace nichts.

EDIT: Da str_ireplace das gleiche ist nur mit irrelevanter Groß-/Kleinschreibung, wird mir das auch nicht viel helfen. Denn der Suchbegriff unterschiedet sich nicht nur darin vom Stichwort, sondern ist auch teilweise nur ein Teil des eigentlichen Stichworts. "jquer" und "jQuery 1.9" wie ich schon sagte...
 
Was verstehst Du genau unter Stichwort und Suchbegriff?

Soweit ich es verstehe möchtest Du z.B. eine Suche nach

Code:
jquer

durchführen und dabei auch Treffer für

Code:
jQuery

landen. Das ist auf MySQL bezogen mit LIKE möglich:

Code:
 ... WHERE spalte LIKE '%jquer%'

möglich. Dabei werden sowohl

Code:
jquer

als auch

Code:
jQuery

gefunden.

Wenn Du diese Suchbegriffe dann in der Ausgabe hervorheben willst, reicht das o.g. str_replace ebenfalls völlig aus. Du wirst dabei jedoch im Fließtext die Wörter in etwa so hervorheben:

bla wort jQuery bla wort

Wenn es nicht das ist was Du suchst, versuch deine Frage mal genauer zu formulieren.
 
Was verstehst Du genau unter Stichwort und Suchbegriff?

Soweit ich es verstehe möchtest Du z.B. eine Suche nach jquer durchführen und dabei auch Treffer für jQuery landen. Das ist auf MySQL bezogen mit LIKE möglich:
Code:
 ... WHERE spalte LIKE '%jquer%'
möglich.

Ja, das ist mir klar und so habe ich es ja auch gemacht. Das ist ja nicht die Frage sondern das funktioniert ja bereits einwandfrei. Eigentlich dachte ich es ist eindeutig was ich brauche, scheint aber nicht der Fall zu sein. Also nochmal:

Ich suche nach "jquer". Ein Blogbeitrag mit den Stichworten "jQuery 1.9 Mobile API HTML5" wurd ausgegeben, da "jquer" "like" "jQuery 1.9" ist.
Nun möchte ich herausfinden, welcher von den Stichworten "like" dem Suchbegriff "jquer" ist. Ich möchte dass PHP mir sagt, dass es sich um "jQuery 1.9" handelt.

PHP:
$suchbegriff = "jquer";

$text = str_replace($suchbegriff, "<b>".$suchbegriff."</b>", $text);

Das würde den Suchbegriff "jquer" im Text hervorheben. Doch genau da ist das Problem, denn der Suchbegriff kommt so garnicht im Text vor, sondern nur so ähnlich!!

PHP:
$text = "jQuery 1.9 ist toll.";

$text = str_replace("jquer", "<b>jquer</b>, $text);

echo $text;

Gibt aus: "jQuery 1.9 ist toll."
Denn "jquer" entspricht nicht "jQuery 1.9" und deswegen nützt str_replace hier einfach nichts. Genauso wenig wie str_ireplace.
 
Zuletzt bearbeitet von einem Moderator:
Ich glaube jetzt ahne ich was Du meinst. Du willst (ähnlich wie Google es macht) bei der Ausgabe von Suchergebnissen ganze Wörter hervorheben (also "jQuery" wenn nach "jquer" gesucht wurde) oder sogar ganze zusammenhängende Begriffe hervorheben die zu dem gesuchten Wort passen.

Dafür sehe ich (sehr ähnliche, aber im Aufwand unterschiedliche) Möglichkeiten:
a) Du programmierst dir eine Stichwortdatenbank in der Du Suchbegriffteile ("jquer") mit ganzen Wörtern ("jQuery") verknüpfst. Auf die Art kannst Du Auch das Suchwort "jquer" mit dem Begriff (der aus mehreren Wörtern besteht) "jQuery 1.9" verbinden. Bei der Ausgabe der Suchergebnisse greifst Du dann auf diese Stichwortdatenbank zu und hebst die mit dem Suchbegriff verbundenen Wörter hervor.
b) Du programmierst dir ein Wörterbuch, so wie es Google auch im Hintergrund hat. Darin sind möglichst viele Wörter enthalten. Führst Du nun die Suche aus, suchst Du auch gleichzeitig in diesem Wörterbuch nach Begriffen die einen Teil des gesuchten Wortes enthalten. So kannst Du den Suchbegriff mit einem Wort aus dem Wörterbuch verbinden und in der Suchergebnisausgabe dann das Wörterbuch-Wort entsprechend hervorheben.

Das was Du willst ist imho nicht mit MySQL alleine lösbar. Dafür braucht es wie beschrieben schon die inhaltlichen Voraussetzungen. MySQL und auch PHP können von sich aus nicht erkennen, dass sie bei der Suche nach "jquer" den Suchbegriff "jQuery 1.9" hervorheben soll - da gibt es technisch gesehen keinerlei Zusammenhang. Daher muss der Zusammenhang inhaltlich hergestellt werden.
 
Idee: Deine LIKE-Abfrage geht ja nur über die Stichworte. Du lädst die Stichworte des gefundenen Artikels in ein Array und prüfst dann einzeln, ob der Suchstring in dem Stichwort enthalten ist. Wenn ja, hast du das gefundene Stichwort und kannst mit diesem weiter arbeiten.
 
Idee: Deine LIKE-Abfrage geht ja nur über die Stichworte. Du lädst die Stichworte des gefundenen Artikels in ein Array und prüfst dann einzeln, ob der Suchstring in dem Stichwort enthalten ist. Wenn ja, hast du das gefundene Stichwort und kannst mit diesem weiter arbeiten.

Ja, sowas hatte ich eigtl auch vor. Nur leider weiß ich nicht, wie eine Funktion/Regex aussehen muss, die genauso tickt wie Sql "like" und mir dementsprechend auch immer das gleiche Ergebnis liefert, wie like.

Falls das nicht möglich ist dann würde ich das wohl eher weglassen, als eine Datenbank aller möglichen Suchbegriffe mit übereinstimmenden Stichwörtern anzulegen. Ich müsste ja praktisch jedes Mal, wenn ich einen Blogeintrag schreibe, für jedes der enthaltenen Stichwörter alle möglichen Suchbegriffe herausfinden und speichern. Der Aufwand wäre viel zu groß..

EDIT: Ich werde es nun so machen wie Banana_Jones schreibt und einfach eine regex machen die Suchwort enthält und prüft, ob es im Stichwort vorhanden ist. Das mag nicht immer zu 100% mit like übereinstimmen, aber ist sicher besser als nichts.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben