Frage

Ich habe eine Datenbank voller asiatischer Zeichen gefüllt Aufzeichnungen (Chinesisch, Japanisch und Koreanisch) neben denen mit lateinischen Zeichen gefüllt Aufzeichnungen (English, Français, nennen Sie es), und ich möchte ihnen die Volltextsuche durchzuführen.

MySQL sagt:

  

Ideographische Sprachen wie Chinesisch   und Japaner haben nicht Wort   Begrenzer. Daher ist die FULLTEXT-   Parser kann nicht bestimmen, wo Worte   beginnen und in dieser und anderen derartigen Ende   Sprachen. Die Auswirkungen dieser   und einige Workarounds für das Problem   beschrieben werden in Abschnitt 11.8,   „Volltextsuche“.

Abschnitt 11.8 eigentlich keine Abhilfen bieten oder sogar das Problem nennen.

So , wie Sie eine Suche nach einem einzigen chinesischen Zeichen in einer gemischten Charakter Datenbank sortieren würden? %LIKE% funktionieren würde, aber es nicht das raffinierte Relevanz Rating bewertet. Soll ich zähle nur die Zeiten ein Zeichen im Datensatz angezeigt wird, und Rang damit sagen? Ich schätze irgendwelche Ratschläge Sie haben. Vielen Dank!

War es hilfreich?

Lösung

Es hängt von der Größe des Datensatzes. Wenn wir Hunderttausende von Zeilen zu sprechen, würde ich wahrscheinlich einen Blick auf eines der ausgezeichneten unabhängigen Volltextsuche Lösungen nehmen. Ich habe eigentlich nie mit diesem Problem mysqlf zu tun hatte, also bin ich nicht sicher, welche Lösungen, die Unterstützung für asiatische Sprachen enthält.

Ich weiß jedoch, dass lucene Sport einen Analysator für Chinesisch, Japanisch und Koreanisch, so meine Vermutung ist, dass es irgendeine Art von Unterstützung für das, was Sie tun. Was ich in der Regel tun, wenn ich lucene mit PHP integrieren müssen, ist, dass ich lucene als Socket-Server implementieren und eine Verbindung zu ihm von PHP.

Wenn der Datensatz klein genug ist, könnte es eine Option sein, Ihren eigenen Ad-hoc-Ansatz zu rollen. Es gibt zwei Teile zu diesem Problem: Retrieval von Dokumenten gezählt werden, und die tatsächliche Ranking. Es gibt mehrere Möglichkeiten, den Abruf zu tun. Man könnte seine LIKE zu verwenden, wenn Sie Daten-Set ausreichend klein ist. Ein weiterer könnte sein, eigene Disk-basierten Indexschema zu rollen, obwohl dies ziemlich komplex sein würde und zeitaufwendig. Sie könnten auch MySQL als Mittelweg verwenden, wie unten beschrieben.

Um ein Indexierungsschema mit MySQL zu implementieren, würden Sie ein paar Tische mit folgenden Struktur erstellen müssen:

document
  document_id
  document_text
  document_tokencount

document_token
  document_id
  token_id
  token_docfrequency
  index (token_id, document_id)

token
  token_id
  token_unicode
  token_globalfrequency
  index (token_unicode)

Dann würde ich jedes Dokument verarbeiten und für jedes Zeichen (Token) in einem Dokument eine Zeile in die document_token Tabelle einfügen. Das token_unicode Feld würde die Ganzzahl Unicode-Sequenz enthalten, verwendet, um diese Figur zu referr. Das token_docfrequency Feld enthält eine ganze Zahl, die der Anzahl von Malen entspricht, die das Dokument das Token enthält, während das token_globalfrequency Feld die Gesamtzahl der Zeiten enthält der Begriff verwendet wird, in allen Dokumenten.

Dies würde es ermöglichen Ihnen eine schnelle Suche nach Tokens zu tun:

SELECT * FROM document_token WHERE token_id = 1
UNION
SELECT * FROM document_token WHERE token_id = 2
UNION
SELECT * FROM document_token WHERE token_id = 3

(die Vereinigung Ansatz ist ein Hack, mysql zu verwenden Indizes für alle wählen, und wird höchstwahrscheinlich wird schneller als die entsprechende Abfrage mit einem einzigen Auswahl und mehr oder Aussagen erlaubt)

Dies lässt uns mit Relevanz als das verbleibende Problem Ranking, das ist, was Sie wirklich gefragt. :) Dies kann durch Verwendung der Vector Space Model (VSM) mit ziemlich guten Ergebnissen durchgeführt werden .

eine Suche Nachdem ich das erste, was Sie tun würden, ist die TF-IDF zu berechnen für dieses Token punkten. Dies erfolgt nach der Formel:

tf-idf = tf(t,d) / tf(d) * log(D / d(t))

where:
tf(t,d) = token frequency in current document
tf(d) = total number of tokens in current document
D = total number of documents
d(t) = number of document that contains the token

Berechnen Sie diese Partitur für jeden Begriff in der Suchabfrage zuerst, und speichern Sie das Ergebnis in einer hashmap oder etwas ähnlich. Dies ist der erste Vektor, genannt v_1. Dann fahren Sie mit dem ersten Dokument. Berechnen Sie die tf-idf-Score für jeden Begriff in dem Dokument als auch, und speichern Sie es als v_2. Jetzt können Sie eine Punktzahl für dieses Dokument berechnen mit Cosinus similiarity :

score = arccos(v_1 * v_2 / (|v_1| * |v_2|))

Das Ergebnis ist ein Wert, der verwendet werden kann, um das Dokument zu ordnen. Weiter und tut dies für jedes Dokument. Die Art sich in absteigender Reihenfolge. Das erste Dokument in der Liste der wichtigsten sein.

Dies könnte alles klingt ein wenig kompliziert, aber wenn Sie ein grundlegendes Verständnis der linearen Algebra haben, könnten Sie wahrscheinlich eine funktionierende Lösung in wenigen Stunden herstellen. wenn überhaupt möglich, noch, eine bestehende Lösung wie Lucene.

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