Die beste Methode zum Speichern und Abrufen von Synonymen in der Datenbank mysql

7

Ich mache eine Synonymliste, die ich in der Datenbank speichern und abrufen werde, bevor ich die Volltextsuche durchführe.

Wenn Benutzer wie folgt eingibt: word1

Ich muss in meiner Synonymtabelle nach diesem Wort suchen. Wenn das Wort gefunden wird, würde ich alle Synonyme dieses Wortes AUSWÄHLEN und es in der Volltextsuche bei der nächsten Abfrage verwenden, wo ich die Abfrage wie

konstruiere

MATCH (Spaltenname) AGAINST ((Wort1a Wort1b Wort1c) IM BOOLEAN MODUS)

Wie also speichere ich die Synonyme in einer Tabelle? Ich habe 2 Möglichkeiten gefunden:

  1. mit Schlüssel- und Wortspalten wie

    %Vor%

So kann ich die genaue Übereinstimmung des eingegebenen Wortes in einer Abfrage finden und seine ID finden. In der nächsten Auswahl bekomme ich alle Wörter mit dieser ID und irgendwie concate sie mit einer Recordset-Schleife in der Server-Seite langauge. Ich kann dann die echte Suche auf der Haupttabelle aufbauen, die ich nach den Wörtern suchen muss.

  1. verwendet nur Wortspalten wie

    %Vor%

Nun ich die SELECT für mein Wort, wenn es in irgendeinem Datensatz ist, wenn es ist, extrahieren Sie den gesamten Datensatz und explodieren Sie es bei | und ich habe wieder meine Worte, die ich benutzen kann.

Dieser zweite Ansatz sieht für denjenigen, der diese Datenbank von Synonymen erstellt, einfacher aus, aber ich sehe zwei Probleme:

a) Wie finde ich in mysql, wenn ein Wort innerhalb der Zeichenkette ist? Ich kann 'word1a' nicht mögen, weil Synonim in einer Art und Weise sehr ähnlich sein können, dass wow1a strowberry sein könnte und strowberries könnte Vögel und Wort 2a könnte Beere sein. Offensichtlich brauche ich exakte Übereinstimmung, also wie könnte eine LIKE-Anweisung innerhalb einer Zeichenkette genau übereinstimmen?

b) Ich sehe ein Geschwindigkeitsproblem, mit LIKE würde ich nehmen nehme mehr mysql take als "=" mit dem ersten Ansatz, wo ich genau ein Wort übereinstimmen. Auf der anderen Seite in der ersten Option brauche ich 2 Anweisungen, eine, um die ID des Wortes zu bekommen und zweitens, um alle Wörter mit dieser ID zu bekommen.

Wie würden Sie dieses Problem lösen, eher ein Dilemma, welches Vorgehen zu ergreifen? Gibt es eine dritte Möglichkeit, die ich nicht sehe, dass es für den Admin einfach ist, Synonyme hinzuzufügen und zu bearbeiten und gleichzeitig schnell und optimal? Ok ich weiß es gibt normalerweise keinen besten Weg; -)

UPDATE : Die Lösung, zwei Tabellen für Masterwort und zweites für Synonymwörter zu verwenden, funktioniert in meinem Fall nicht. Weil ich kein MASTER-Wort habe, das der Benutzer in das Suchfeld eingibt. Er kann jedes der Synonyme in das Feld eingeben, also frage ich mich immer noch, wie ich diese Tabellen einstellen soll, da ich keine Masterworte habe, die IDs in einer Tabelle haben und mit der ID des Masters in der zweiten Tabelle übereinstimmen würde. Es gibt kein Masterwort.

    
Jerry2 20.10.2010, 04:00
quelle

3 Antworten

11

Verwenden Sie keine (eine) Zeichenkette, um verschiedene Einträge zu speichern.

Mit anderen Worten: Erstellen Sie eine Worttabelle (word_ID, word) und eine Synonymtabelle (word_ID, synonym_ID) und fügen Sie dann das Wort der Worttabelle und einen Eintrag pro Synonym der Synonymtabelle hinzu.

UPDATE (drittes Synonym hinzugefügt)

Ihre Worttabelle muss jedes Wort (ALL) enthalten, Ihre Synonymtabelle enthält nur Zeiger auf Synonyme (kein einziges Wort!) ..

Wenn Sie drei Wörter haben würden: A, B und C, die Synonyme sind, wäre Ihr DB

%Vor%

Haben Sie keine Angst vor den vielen Einträgen in der SYNONYM_TABLE, sie werden vom Computer verwaltet und müssen die bestehenden Beziehungen zwischen den Wörtern widerspiegeln.

2. Ansatz

Sie könnten auch versucht sein (ich finde nicht, dass Sie das sollten!), mit einer Tabelle zu gehen, die separate Felder für Wort und eine Liste von Synonymen (oder IDs) (word_id, word, synonym_list) enthält. Beachten Sie, dass dies der Funktionsweise einer relationalen DB widerspricht (ein Feld, eine Tatsache).

    
lexu 20.10.2010, 04:08
quelle
7

Ich denke, 3 Spalten und nur eine Tabelle ist besser WORD_TABLE

%Vor%     
Hasan Amin Sarand 12.07.2011 06:08
quelle
3

Ein anderer Ansatz besteht darin, Bedeutung zu speichern (dies verwendet keine Hauptwörter, sondern eine Bedeutungs-Tabelle, die stattdessen gruppiert)

wäre, die Wörter in einer Wörter-Tabelle ohne Synonyme und nur mit Text wie folgt zu speichern:

Viele Wörter, eine Bedeutung

%Vor%

Und speichern Sie die Wörter in einer anderen Tabelle, zum Beispiel, wenn A, B und C alle Synonyme von 1 Bedeutung

waren %Vor%

Obwohl es sehr ähnlich aussieht wie Hasan Amin Sarand , hat es den entscheidenden Unterschied, dass Sie es nicht tun Wählen Sie aus der WORD_TABLE, aber wählen Sie stattdessen aus der MEANING_TABLE, das ist viel besser und ich lernte das auf die harte Tour.

Auf diese Weise speichern Sie die Bedeutung in einer Tabelle und so viele Wörter für diese Bedeutung, wie Sie in einer anderen möchten.

Obwohl davon ausgegangen wird, dass Sie pro Wort eine Bedeutung haben.

Viele Wörter, viele Bedeutungen

Wenn Sie Wörter mit mehreren Bedeutungen speichern möchten, benötigen Sie eine weitere Tabelle für die Beziehung "Viele zu Viele". Das Ganze wird zu:

%Vor%

Jetzt können Sie so viele Wörter mit so vielen Bedeutungen haben, wie Sie wollen, wobei jedes Wort bedeuten kann, was Sie wollen, und jede Bedeutung kann viele Wörter haben.

Wenn Sie ein Wort und seine Synonyme auswählen möchten, tun Sie das

%Vor%

Sie können dann auch Bedeutungen speichern, die noch kein Wort enthalten oder von denen Sie das Wort nicht kennen.

Wenn Sie nicht wissen, zu welcher Bedeutung es gehört, können Sie einfach eine neue Bedeutung für jedes neue Wort einfügen und die Bedeutungs_ID später in der Worttabelle fixieren.

Sie können dann sogar die Wörter speichern und auswählen, die gleich sind, aber unterschiedliche Bedeutungen haben

%Vor%     
Timo Huovinen 25.11.2013 15:54
quelle

Tags und Links