2009-04-30 4 views
1

Ich behalte eine einfache PHP-basierte In-House-cms. Ich würde gerne den Text von Artikeln durchsuchen, wie sie im System gespeichert werden für das, was später Zehntausende von verschiedenen Token sein wird, um automatisch Links auf diese Token anzuwenden und auch eine Beziehung in einer Assoziationstabelle zwischen den Token herzustellen Artikel und die Entität, die das Token darstellt.Suche Text für (möglicherweise) Zehntausende von Token

Was ist der beste Weg, dies zu tun? Gibt es einen schnelleren/effizienteren Weg dies zu tun, als eine Liste aller Token und ihrer relevanten Entität/ID jedes Mal abzurufen, wenn ein Artikel gespeichert wird?

Ich bin weniger interessiert an der Ersetzung der Token als der beste Weg, um die Liste der Token zu suchen - sie werden aus verschiedenen Tabellen kommen, und ich würde denken, dass auf einer Anfrage die Datenmenge was abgefragt werden muss, würde sowohl die DB als auch die Speicherlast des Skripts ziemlich belasten.

Edit: Ich denke, ich habe die Frage falsch gestellt.

Betrachten Sie den folgenden Text:

Steve McMuffin aß siebzehn Fabulous Furry Fajitas The Stinking Bean, während Johnson Fatlumps zweiunddreißig aßen.

Ich habe zwei Leute drin, die beide in der "Personen" -Tabelle sind, ein Restaurant, das in der "Restaurant" -Tabelle ist und ein Restaurant-Menüelement, das in der "restaurant_menu_item" -Tabelle ist.

ich die beste Art und Weise wissen will, nachdem der Text gespeichert wird, automatisch zu durchlaufen und zu identifizieren, was ein Mensch ist, was ist ein Restaurant, und was ist ein Restaurant Menüpunkt ohne, um benutzerdefinierten Markup als die Zuflucht Zielpublikum hat praktisch keine Chance, das jemals richtig zu machen.

+1

Interessante Frage umgehen kann.Eine Sache zu beachten: Was ist, wenn Sie eine Kollision haben? Was ist, wenn "Steve McMuffin" eine Person und "McMuffin" ein "Restaurant-Menüelement" ist? Wie möchten Sie damit umgehen? –

+0

Guter Punkt. Ich habe keine Ahnung! Hast du welche? – Shabbyrobe

Antwort

1

Dies wird immer schwierig sein (rechnerisch sowieso), es sei denn, Sie können eine Garantie für das Token-Format erhalten. Ohne Markup weiß der Computer wirklich nicht, dass eine bestimmte Zeichenkette eine besondere Bedeutung hat, wenn nicht gelernt werden kann, ein Format zu erkennen.

Die "einfache" Antwort ist es, den Text für jedes Token durchzuschleifen, zu sehen, ob es da ist, und es zu handhaben. Aber Sie haben zwei Probleme: Rechenzeit und Kollisionen (wie Chad in seinem Kommentar darauf hingewiesen hat).

Gibt es ein sehr einfaches Markup, das Sie erzwingen können? MediaWiki erstellt nur interne Links, wenn eine Phrase von [[eckigen Klammern] umgeben ist. Viele Wiki-Software erstellt nur Links, wenn Sie CamelCaseThePhrase.

Ich kann mir keinen Weg vorstellen, wie die Anwendung bestimmte Zeichengruppen automatisch erkennen kann, ohne jedes definierte Token zu prüfen oder irgendeine Art von Format zu erzwingen.

Sind Sie sicher, dass Ihr Publikum nicht so etwas wie

SteveMcMuffin ate seventeen FabulousFurryFajitas at 
TheStinkingBean, while JohnsonFatlumps ate thirty-two. 

oder

[[Steve McMuffin]] ate seventeen [[Fabulous Furry Fajitas]] at 
[[The Stinking Bean]], while [[Johnson Fatlumps]] ate thirty-two. 
+0

Fast sicher, leider. Wenn sie mit solchen Dingen umgehen könnten, hätte ich viel weniger zu tun :) – Shabbyrobe

0

Wir hatten eine ähnliche Situation. Wir verwendeten Reguläre Ausdrücke für das Parsen und Ersetzen der Token. Da der Originalartikel eine Vorlage war, mit der wir neue Artikel mit ersetzten Token generieren konnten, speicherten wir den generierten, sodass keine Änderungen an der Vorlage zu einem neuen Parsen führten.

Verwandte Themen