Frage

Use Case

Wenn ein Benutzer auf meine Website geht, werden sie mit einem Suchfeld, wie so viel konfrontiert. Sie können für die Suchergebnisse Plan Text. „.Net Fragen“, ‚geschlossene Fragen‘, „.net und Java“, etc .. Die Suche wird ein wenig anders funktionieren, die so ist, daß sie so viel wie möglich von dem Schema der Datenbank versuchen, anstatt einem gerade die Volltextsuche. So „.net Fragen“ werden nur für .net Fragen suchen, wie zu .net Antworten gegen (wahrscheinlich nicht für SO Fall nur ein Beispiel hier), ‚geschlossene Fragen‘ werden wieder Fragen, die geschlossen sind, „.net und Java“ Fragen werden Fragen zurück, die sonst auf .NET- und Java und nichts beziehen.

Problem

Ich bin nicht allzu vertraut mit den Worten, aber ich mag im Grunde ein Schlüsselwort SQL angetrieben Suche zu tun. Ich weiß, dass das Schema der Datenbank, und ich kann auch die Datenbank Datamine. Ich möchte alle aktuellen wissen Ansätze gibt, die bereits vorhandene, bevor ich versuchen, dies zu implementieren. Ich denke, diese Frage ist, was ist ein gutes Design für das genannte Problem.

Vorgeschlagen

Meine vorgeschlagene Lösung so sieht weit so etwas wie diese

  1. Reinigen Sie die Eingabe. Entfernen Sie einfach alle Sonderzeichen
  2. Parse die Eingabe in Datenblöcke. Brechen Sie eine Eingabe von "c # java" in C # und Java behandeln Sie auch die Sonderfälle wie " 'c # java' Fragen" in 'c # java' und "Fragen".
  3. Erstellen Sie einen Baum aus dem Eingang
  4. Binden Sie die Daten in Metadaten. So konvertieren Sachen wie geschlossene Fragen und auf die isClosed Spalte einer Tabelle beziehen.
  5. Konvertieren des Baumes in eine SQL-Abfrage.

Thoughts / Anregungen / Links?

War es hilfreich?

Lösung

Ich betreiben ein digitales Musikgeschäft mit einem „einzigen Such“ dass Gewichte Keywords auf der Grundlage ihres Vorkommen und das Schema, in dem Produkt erscheinen, zum Beispiel. mit verschiedenen Spalten wie "Artist", "Titel" oder "Publisher".

Die Produkte werden auch auf Alben und Wiedergabelisten verwandt, aber für einfachere Erklärung, werde ich nur näher auf die Indizierung und Abfrage von Produkten Keywords.

Datenbank-Schema

Keywords Tabelle - eine gewichtete Tabelle für jedes Wort, das möglicherweise gesucht werden konnte (daher ist es irgendwo referenziert) mit den folgenden Daten für jeden Datensatz:

  • Keyword-ID (nicht das Wort),
  • Das Wort selbst,
  • A Soundex Alpha-Wert für das Wort
  • Gewicht

ProductKeywords Tabelle - eine gewichtete Tabelle für jedes Keyword durch ein ein Produkt Felder verweist (oder Spalten) mit den folgenden Daten für jeden Datensatz:

  • Produkt-ID,
  • Keyword-ID,
  • Gewicht

Keyword Gewichtung

Der Gewichtungswert ist ein Hinweis darauf, wie oft die Worte auftreten. Passende Keywords mit einem niedrigeren Gewicht sind „einzigartige“ und sind eher zu sein, was gesucht wird. Auf diese Weise auftretende Worte sind oft automatisch „down-gewichtet“, zum Beispiel. "Das", "a" oder "I". Allerdings ist es am besten auf atomare Ereignisse dieser gemeinsamen Worte vor der Indizierung Streifen aus.

Ich habe Zahlen für die Gewichtung, aber einen Dezimalwert mit mehr Vielseitigkeit bieten, möglicherweise mit etwas langsamer zu sortieren.

Indexing

Immer wenn ein Produktfeld aktualisiert wird, zB. Künstler oder Titel (was nicht passieren, dass oft), eine Datenbank-Trigger Wieder Indizes den Keywords des Produkt mögen so innerhalb einer Transaktion:

  1. Alle Produkte Stichworte sind distanziert und gelöscht, wenn nicht mehr referenziert werden.
  2. Jede indizierte Feld (z. B. Künstler) Wert gespeichert / abgerufen als Schlüsselwort in seiner Gesamtheit und für eine direkte Anpassung an das Produkt in der ProductKeywords Tabelle zusammen.
  3. Das Schlüsselwort Gewicht wird dann um einen Wert erhöht, der auf die Bedeutung des Feldes abhängt. Sie können, subtrahieren bezogen auf die Bedeutung des Feldes hinzufügen. Wenn Künstler wichtiger als Titel ist, subtrahieren 1 oder 2 aus seiner ProductKeyword Gewichtseinstellung.
  4. Jede indizierte Feldwert aller nicht-alphanumerischen Zeichen und spaltete sich in getrennten Wortgruppen abgezogen, zum Beispiel. "Billy Joel" wird zu "Billy" und "Joel".
  5. Jede einzelne Wortgruppe für jeden Feldwert soundexed und gespeichert / als Schlüsselwort abgerufen und mit dem Produkt in der gleichen Art und Weise verbunden, wie in Schritt 2. Wenn ein Schlüsselwort bereits mit einem Produkt in Verbindung gebracht worden ist, wird sein Gewicht einfach eingestellt .

Querying

  1. Nehmen Sie die Eingabe Abfrage Suchtext in seiner Gesamtheit und sucht ein direktes passendes Schlüsselwort. Rufen Sie alle ProductKeywords für das Schlüsselwort in einer In-Memory-Tabelle zusammen mit Keyword Gewicht (verschieden von ProductKeyword Gewicht).
  2. Streifen aus allen nicht-alphanumerischen Zeichen und Split-Abfrage in Schlüsselwörter. Rufen Sie alle vorhandenen Keywords (nur wenige Willen Spiel). Registriert ProductKeywords um passende Keywords in-memory-Tabelle zusammen mit Keyword Gewicht, die aus dem ProductKeyword Gewicht unterschiedlich ist.
  3. Wiederholen Sie Schritt 2, aber Verwendung soundex Werte statt, Gewichte eingestellt werden als weniger wichtig.
  4. Mitglied werden abgerufen ProductKeywords ihrer verwandten Produkte und jedes Produkt Verkäufe abrufen, die ein Maß der Popularität ist.
  5. Ergebnisse sortiert nach einem Stichwort Gewicht, ProductKeyword Gewicht und Vertrieb. Die endgültige Summierung / Sortier- und / oder Gewichtung hängt von der jeweiligen Implementierung.
  6. Begrenzungs Ergebnisse und Return-Produkt Suchergebnisse an den Client.

Andere Tipps

Was Sie suchen ist Natural Language Processing . Merkwürdigerweise dieses verwendet kostenlos enthalten: English Query in SQL Server 2000 und vor. Aber es ist jetzt weg

Einige andere Quellen sind:

Das Konzept ist ein Meta-Data-Dictionary-Mapping Worte Tabelle, Spalten, Beziehungen usw. und einem englischen Satz Parser kombiniert zusammen einen englischen Satz (oder nur einige Schlüsselwörter) in eine echte Abfrage konvertieren

Einige Leute sogar Benutzer English Query mit Spracherkennung für ein paar wirklich coole Demos, nie sah es in Zorn verwendet aber!

Wenn Sie SQL Server verwenden, können Sie einfach seine Full- Text Suche -Funktion, die speziell entwickelt wurde, um Ihr Problem zu lösen.

Sie könnten einen hybriden Ansatz verwenden, nehmen Sie die Volltextsuchergebnisse und weitere Filter sie von Ihrem # 4 auf den Meta-Daten. Für etwas intelligentere Sie könnte eine einfache erstellen überwacht Lösung Lernen durch die Verfolgung, was der Benutzer klickt auf nach der Suche und speichern diese Wahl mit den wichtigsten Suchbegriffe in einem Entscheidungsbaum verbindet. Suchen würde dann aus diesem Entscheidungsbaum abgebaut werden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top