Hi Andreas
Man kann bei Dir ja 'eigenständige Worte' ankreuzen. Wird dann nur in 'Keywd_Item' gesucht? Und angenommen ich suche nach 'ndreas' ohne 'eigenständige Worte' anzuklicken. Suchst Du dann erst in 'Part_Keywd' und das zugehörige Keywd dann in 'Keywd_Item'? Also etwa so?:
Nein, dann such ich immernoch nur in Keywd_Item. Part_Keywd kommt erst ins Spiel, wenn man vor dem zu suchenden Teilwort ein * angibt.
SELECT Itemid
From Keywd_Item, Part_Keywd
WHERE Keywd_Item.Keywd = Part_Keywd.Keywd
AND Part_Keywd.PartKeywd = 'ndreas'
Nicht ganz. Eigentlich ist das ganze eine uncorrelated Subquery, es muss also nur einmal die Liste aller möglichen Wörter ermittelt werden und nicht pro Item. So artet das bei Postgres in einen Nested Loop aus. Ich hole mir in einer separaten Query alle möglichen Wörter und generiere daraus eine Bedingung die ich dann mit IN benutze. Möglich wäre auch direkt eine Subquery zu benutzen aber das artet bei Postgres ebenfalls in einem Nested-Loop aus und MySQL beherrscht sowas nur in der Alphaversion.
Allgemein würde ich explizite Joins empfehlen da du dann selber bestimmen kannst, in welcher Reihenfolge die ausgeführt werden.
Aber was machst Du dann (falls es denn so ist), wenn 'Andreas' ohne 'eigenständige Worte' gesucht wird. Das kommt ja in PartKeywd gar nicht vor. Woher weißt Du, ob es als Wortanfang (WHERE Keywd_Item.Keywd LIKE 'Andreas%') oder als Wortende gesucht werden muß (WHERE Part_Keywd.PartKeywd = 'Andreas')?
Wenn ein * angegeben wird, muss vorher etwas kommen. Wenn nicht, ist das kein Treffer. Alternativ könnte man einfach als mögliches Teilwort auch das ganze Wort aufnehmen.
Nach dem Indizieren können keine Wörter mehr entfernt werden da dann ein erneutes indizieren notwendig wäre.
was machst Du denn, wenn ein Posting gelöscht wird und es als einziges ein indiziertes Wort enthielt?
Ehm, hä? Das betrifft nur die Stoppwortliste. Wenn etwas indiziertes geändert wird, wozu auch löschen gehört, muss das im Index natürlich nachgeführt werden.
Hier leider gar nichts verstehn:
Dem ganzen ist noch eine Volltextsuche nachgelagert um auch Phrasen finden zu können. Dazu besitzt jede Sektion ein File indem die einzelnen Einträge zu finden sind.
Was für Einträge stehen da drin?
Titel | volltext
Jedes Item hat eine Startposition in diesem File sowie eine Länge die beide in der Tabelle Item gespeichert sind.
Wenn jetzt eine Phrase in ihre Einzelwörter zerlegt auf ein Item zutrifft,...
also, Du suchst alle Wörter als ganze Wörter und wenn alle gefunden werden _und_ alle Treffer auf mindestens ein gemeinsames Item verweisen (Itemid)
Ehm, hä? Ich suche alle Items die prinzipiell in Frage kommen, also eine Verbindung zu sämtlichen Wörter innerhalb einer Phrase haben.
...wird dieser Text ausgelesen und mit der gesammten Phrase verglichen.
der Text der gefunden Itemid. Ist das so richtig?
Aber was für Einträge stehen in diesem File der Sektion?
Titel und Volltext eines jeden Items das zu dieser Sektion gehört.
ja, ich war auf der neuen. Also 'apperlot' (als Teil von 'Sapperlot') kann man jetzt nicht mehr finden. Ist das nun Absicht?
Solange du kein * vorne hin machst, ja. Die Anleitung für die Suche ist leider noch nicht ganz fertig. Hier mal die EBNF für die Suchesyntax:
searchfield = clause.
clause = {word | expression}.
expression = ["-"] (type ":" ( ["*"] word | """{word}""" )) | ["*"] word.
type = "author" | "category" | "body" | "title".
word = "a" | ... | "z" | "A" | ... | "Z".
Gruss Daniela