PHP - Suchwörter in einer Datenbank

BenschM@ster

Mitglied
Guten Morgen allerseits,

kann mir jemand sagen wie ich am besten eine unbestimmte Anzahl von Suchwörtern zu einem Artikel in eine Datenbank eintrage?
Momentan trage ich alle in eine Zelle "Suchwörter" ein. Das bedeutet aber, dass ich beim Suchen dann diese Wörter alle splitten muss.
Geht es sinnvoller?

Gruß,
Benjamin
 
Jedes Suchwort bekommt einen eigenen Datenbankeintrag und die n:m-Beziehung der Suchwörter und Artikel werden über eine zusätzliche Tabelle abgebildet. (Siehe auch Normalisierung)
 
Bedeutet ich muss eine Tabelle eröffnen die wie folgt aufgebaut ist:

ID - Artikel ID - Suchwort ?
Dann muss ich wohl nochmal einiges umprogrammieren ;-)

Danke sehr!
 
Was ist das für eine Datenbank? MySQL?

Ist es da nicht einfacher, eine Text-Spalte (entsprechend groß) an die Tabelle anzuhängen und dann über die Spalte einen FULLTEXT-Index anzulegen.

Dann kann man die Suche über diese Spalte mit einem einfachen SELECT erledigen:

Code:
SELECT *
  FROM table
 WHERE MATCH (schlagwortspalte) AGAINST ('suchbegriffe'
    IN BOOLEAN MODE)
 
Was ist das für eine Datenbank? MySQL?

Ist es da nicht einfacher, eine Text-Spalte (entsprechend groß) an die Tabelle anzuhängen und dann über die Spalte einen FULLTEXT-Index anzulegen.

Dann kann man die Suche über diese Spalte mit einem einfachen SELECT erledigen:

Code:
SELECT *
  FROM table
 WHERE MATCH (schlagwortspalte) AGAINST ('suchbegriffe'
    IN BOOLEAN MODE)

- Ja, aber dann musst du, wenn mehrere Artikel dasselbe Suchwort haben, dies auch mehrfach eintragen. Gumbo's Lösung ist die einzige saubere Lösung
 
Sorry, ich will dir nicht auf die Füße treten, aber das urspüngliche Post lautete

Momentan trage ich alle in eine Zelle "Suchwörter" ein. Das bedeutet aber, dass ich beim Suchen dann diese Wörter alle splitten muss.

Und in dem Fall ist es bei der

Code:
MATCH () AGAINST ()

Abfrage nicht notwendig, das Script großartig zu ändern. Die Abfrage sucht in dem Volltext-Index automatisch nach den entsprechenden Schlagwörten. Da muß nichts gesplittet werden.

Will man nun eine N:M-Relation einbauen, bedeutet das zuätzlichen Programmieraufwand, um den entsprechenden Artikeln die Schlagwörter zuzuordnen. Weiterhin kann man dann bei den Relationen auch nur die Schlagwörter zuordnen, die im Vorfeld auch angelegt wurden (weiterer Aufwand für die Pflege einer Stammtabelle). Und der Fragesteller schrieb: eine "unbestimmte" Anzahl von Schlagwörten.

Zudem erlaubt die Abfrage sogar eine mehr oder weniger eingeschränkte Logik, um Schlagwörter explizit auszuschliessen oder zu berücksichtigen.

Beispiele findet man ausreichend in der MySQL-Doku (Stichwort Full-Text Search Functions)

Sascha
 
- Ja, aber dann musst du, wenn mehrere Artikel dasselbe Suchwort haben, dies auch mehrfach eintragen. Gumbo's Lösung ist die einzige saubere Lösung

Wieso? Wie sollte ich es in einer zweiten Mapping Tabelle bewerkstelligen, dass ein Suchwort mehrere Artikel beinhaltet?
Vorteil der anderen Lösung wäre, dass ich, wenn nach mehreren Suchwörtern gleichzeitig gesucht wird, ich nur nach LIKE '%suchwort1' AND LIKE '%suchwort2' suchen kann, und nicht erst alle Suchwörter der Mapping Tabelle den Artikel zuordnen müsste.

Wie würde ich das sinnvoll mit einer extra Tabelle aufbauen?

Gruß,
ben
 
Sorry, ich will dir nicht auf die Füße treten, aber das urspüngliche Post lautete



Und in dem Fall ist es bei der

Code:
MATCH () AGAINST ()

Abfrage nicht notwendig, das Script großartig zu ändern. Die Abfrage sucht in dem Volltext-Index automatisch nach den entsprechenden Schlagwörten. Da muß nichts gesplittet werden.

Will man nun eine N:M-Relation einbauen, bedeutet das zuätzlichen Programmieraufwand, um den entsprechenden Artikeln die Schlagwörter zuzuordnen. Weiterhin kann man dann bei den Relationen auch nur die Schlagwörter zuordnen, die im Vorfeld auch angelegt wurden (weiterer Aufwand für die Pflege einer Stammtabelle). Und der Fragesteller schrieb: eine "unbestimmte" Anzahl von Schlagwörten.

Zudem erlaubt die Abfrage sogar eine mehr oder weniger eingeschränkte Logik, um Schlagwörter explizit auszuschliessen oder zu berücksichtigen.

Beispiele findet man ausreichend in der MySQL-Doku (Stichwort Full-Text Search Functions)

Sascha

- Hmm, ok, ich habe vermutet, dass er für jeden Artikel eine bestimmte Menge Suchwörter eigeben will, also quasi ein Tagging pro Artikel. Die m:n Realtion benötigt einen (eher mässsigen) Programmieraufwand, aber natürlich muss das ganze administriert werden, dass ist richtig


gruss
 
Der Vorschlag von Gumbo:
Code:
TABELLE Artikel
  art_id
  art_name

TABELLE Schlagwort
  sw_id
  sw_name

N:M-Relation Art_Zu_Schlagwort
  sw_id
  art_id

Nun die entsprechenden Indices und Foreign-Keys anlegen, und einen Unique-Key über beide Spalten in der Tabelle ART_ZU_SCHLAGWORT

Dann könntest du jeden vorhandenen Begriff deinem Artikel zuordnen.

Ich würde dir aber immer noch vorschlagen: Leg einen FULLTEXT-Index über die Schlagwortspalte deiner Artikel-Tabelle und probiere es mal mit der
Code:
MATCH () AGAINST ()
Klausel

MySQL-Doku dazu: hier

Sascha
 

Neue Beiträge

Zurück