In meiner Artikelsammlung habe ich einen Textindex:
%Vor%In meiner Artikelsammlung habe ich einen Eintrag wie folgt:
%Vor% (Es gibt tatsächlich verschiedene Werte in abstract
und body
, aus Gründen der Kürze nehmen wir an, dass es die oben genannten sind)
Wenn ich dann versuche, nach diesem Artikel zu suchen:
%Vor%Es wird gefunden.
Aber: Wenn ich dann versuche, nach diesem Artikel zu suchen:
%Vor% Ich bekomme keine Ergebnisse. Aber dann, nachdem ich die language
zu en
oder none
geändert habe, bekomme ich diesen Artikel als Ergebnis mit genau der gleichen Abfrage.
Was mache ich falsch?
Bearbeiten : Wie in den Kommentaren gefordert, hier die genauen Befehle, die zu dem oben beschriebenen Verhalten führen. Sollte es auf diese Weise zuerst getan haben, Entschuldigung.
%Vor%Ich habe auch versucht, die Sprache wieder zu ändern:
%Vor%Bearbeiten: Okay, also habe ich gerade versucht, dieses Beispiel. Aber ich habe auch ein deutsches Zitat hinzugefügt, also habe ich das gemacht:
%Vor%Dann habe ich ein paar Fragen ausprobiert:
%Vor%Fazit: mongoDB funktioniert nicht mit Deutsch? Das ist wirklich frustrierend
wdberkeley hat Recht, aber ich verspüre den Drang, eine kurze Erklärung von stemming hinzuzufügen, weil ich an Benutzern ohne Erfahrung zweifle Das Feld wird den Kern bekommen. Ich möchte auch einige Alternativen und die allgemeinen Einschränkungen hervorheben.
In vielen Sprachen werden Wörter aufgrund von Grammatikregeln, z.B. für das deutsche Wort "Geist" (Geist / Geist / Geist):
%Vor%Dieser Effekt ist auch in Englisch bekannt, aber er ist weniger ausgeprägt, Beispiele:
%Vor% Normalerweise möchten wir, dass Suchvorgänge diese lokale grammatikalische Struktur ignorieren. Wenn wir also nach "Geist"
suchen, sollte eines der obigen Wörter gefunden werden. Dieses Recht zu tun ist extrem schwierig, weil Sprachregeln komplex sind und eine korrekte Antwort nicht ohne Kontext festgelegt werden kann.
Suffix Stripping ist ein gebräuchlicher und relativ einfacher Ansatz, der davon ausgeht, dass bestimmte Endungen höchstwahrscheinlich nur Endungen sind und entfernt werden können, um den Stamm zu erhalten. Manchmal entfernen Stemmer bewusst Buchstaben, die tatsächlich zu dem Stamm gehören, z. "notable" -> "notabl"
.
Da die Sprache der Anführungszeichen bekannt ist, wird der korrekte Stemmer für die Anführungszeichen verwendet. Das funktioniert - mit Ihren Daten:
%Vor%Nun ist das Problem, dass ein Benutzer nicht nach dem Stamm sucht, sondern nach einem abgeleiteten Formular, also müssen wir die gleiche Umwandlung auf den Eingang anwenden . Das Schlüsselproblem ist, dass wir nicht wissen, welche Transformation wurde in erster Linie angewendet wurde. Sie versuchen also, etwas Komplexes bereits mit einer hinzugefügten Variablen zu tun.
Das Gute ist, dass es einen Schneeball gibt, welcher der Stemmer ist, der von MongoDB und anderen Suchsystemen wie SolR verwendet wird. Es ist unter der BSD-Lizenz verfügbar und wurde auf viele Sprachen portiert, so dass es möglich ist, dasselbe durch die Datenbank im Client-Code zu tun. Auf diese Weise behandeln wir die Datenbank nicht als Blackbox, sondern koppeln unseren Clientcode auch mit einem Implementierungsdetail der Datenbank ... Wählen Sie Ihr Gift.
Wir könnten zum Beispiel einfach alle Stemmer überfahren und schauen, welche die Eingabe ändert, aber das könnte zu Fals Positiven führen, da das Wort bereits ein Wortstamm ist und das Wort aus einer anderen Sprache es verkürzt. co_de%).
Zumindest reduzieren wir die Anzahl der Anfragen, die wir machen müssen, wenn wir die Menge der distinct Antworten von den Stemmern nehmen.
Alternativ können Sie in einer Wortliste nach raten fragen, in welcher Sprache diese Abfrage enthalten sein könnte.
Auch bei diesem zusätzlichen Aufwand ist es wichtig, die Einschränkungen der Stammvertiefung durch einfaches Suffix-Stripping zu verstehen. Zum Beispiel werden "Mäuse" nicht gefunden, wenn nach "Maus" gesucht wird, nicht einmal mit dem englischen Stemmer, weil der Stemmer annimmt, dass der Stamm kürzer ist. Die Dinge werden viel schlimmer, wenn die Texte nicht in ihrer angeblichen Sprache sind (Ulysses ...)
Mit anderen Worten: Eine wirklich gute Freitextsuche braucht viel mehr als nur das Stemming, und das Hinzufügen von Abfragen über Sprachen hinweg trägt dazu bei. Eine andere Suchdatenbank ist kein Allheilmittel - das Problem ist tief im Problemraum verwurzelt ...
BEARBEITEN: ElasticSearch hat eine schöne umfassende Erklärung der Stemming (Ich finde diese nachdem die Antwort geschrieben hat
EDIT2:
Warum kann MongoDB nicht einfach verschiedene Wortstämme verwenden?
Die Transformationen werden nur beim Einfügen oder Aktualisieren von Text in der Datenbank angewendet. Die Abfrage sucht einfach nach einer Übereinstimmung des Stamms. Im Wesentlichen wird der Index aus den Stammwörtern gebildet. Was Sie wollen, würde jedes Mal die gesamte Sammlung durchlaufen müssen. Das wäre sehr ineffizient und vereitelt den Zweck der Indexierung. Was Sie tun können, ist diesen Schritt im Client-Code, wie vorgeschlagen.
Warum kann ich nicht einfach $ oder zweimal den Textindex
verwenden?
AFAIK, das ist eine Einschränkung der Abfrage-Engine - wahrscheinlich hat es mit dem Ranking zu tun, weil das Erstellen einer guten Bewertung auf der Grundlage von zwei verschiedenen Eingaben nicht viel Sinn ergibt. Sie können jedoch einfach zwei Abfragen ausführen und die Ergebnisse clientseitig zusammenführen.
Tut mir leid, ich war verrückt. Das Problem ist einfach: Wir versuchen, den Suchtext "vermutlich"
mit dem Dokument text "vermutlich"
abzugleichen, und um dies richtig zu machen, müssen Sie beide mit den gleichen Sprachregeln analysieren. Wenn Sie Folgendes tun:
Die erste Abfrage durchsucht das Dokument, das aufgrund des Feldes language
als deutsch indiziert wurde, wobei "vermutlich"
als englisches Wort verarbeitet wird.
Sie können die Standardsprache für den Textindex festlegen, um die Angabe von $language
in jeder Abfrage zu vermeiden:
Als Workaround habe ich meinen Textindex mit default_language: "none"
und language_override: "none"
erstellt.
Auf diese Weise gibt es keine Stoppwörter oder Stemming. Aber zumindest finde ich direkte Übereinstimmungen unabhängig von der Sprache.
Wenn jemand keine wirkliche Lösung findet, halte ich den mongoDB-Textindex für gebrochen.
Tags und Links mongodb mongodb-query