2017-09-18 2 views
1

Ok, so bin ich sehr durch dieses Verhalten verwirrt. Es scheint widersprüchlich und seltsam, zumal ich gelesen habe, dass Mongo teilweise Suchbegriffen in der Volltextsuche nicht unterstützen soll. Ich benutze Version 3.4.7 von Mongo DB Community Server. Ich mache diese Tests von der Mongo Shell.

Also, ich habe eine Mongo DB-Sammlung mit einem Textindex zugewiesen. Ich habe den Index wie folgt aus:

db.submissions.createIndex({"$**":"text"}) 

Es ist ein Dokument, in dieser Sammlung, die diese beiden Werte enthält:

"Craig"

"Dr. Bob".

Mein Ziel ist eine Textsuche für ein Dokument, das mehrere übereinstimmende Begriffe enthält. So

, hier sind Tests, die ich habe laufen, und ihre inkonsistente Ausgabe:

SINGLE TERM, COMPLETE

db.submissions.find({"$text":{"$search":"\"Craig\""}}) 

Ergebnis: Ruft mir das Dokument mit diesem Wert darin.

SINGLE TERM, PARTIAL

db.submissions.find({"$text":{"$search":"\"Crai\""}}) 

Ergebnis: Gibt nichts, da diese teilweise Suchbegriffs nicht genau alles im Dokument übereinstimmen.

mehrere Begriffe, COMPLETE

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bob\""}}) 

Ergebnis: Gibt das Dokument mit diesen beiden Begriffen in ihm.

mehrere Begriffe, ein Teil

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}}) 

Ergebnis: Gibt das Dokument mit beiden Begriffen darin, trotz der Tatsache, dass ein Begriff Teil ist. Es gibt nichts in dem Dokument, das „Dr. Bo“

mehrere Begriffe paßt, beide Teil

db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}}) 

Ergebnis: Gibt das Dokument mit beiden Begriffen darin, trotz der Tatsache, dass beiden Begriffe sind teilweise und unvollständig. Es gibt nichts im Dokument, das zu "Crai" oder "Dr. Bo" passt.

Frage

Also, es läuft alles auf: warum? Warum passiert es, wenn ich eine Textsuche mit einem Teilbegriff mit nur einem Wert durchführe, wird nichts zurückgegeben. Wenn ich eine Textsuche mit zwei Teilbegriffen mache, bekomme ich das passende Ergebnis? Es scheint nur so seltsam und inkonsequent.

Danke.

+0

Ich habe das gleiche Problem, [Hier klicken] (https://StackOverflow.com/Questions/46288384/Text-Indexes-Mongodb-Minimum-Length-of-Search-String) –

Antwort

3

MongoDB $text Suchvorgänge unterstützen keine teilweise Übereinstimmung. MongoDB erlaubt Textsuchabfragen auf String-Inhalt mit Unterstützung für Groß-/Kleinschreibung, Trennzeichen, Stoppwörter und Stemming. Und die Begriffe in Ihrer Suchzeichenfolge sind standardmäßig ODER-verknüpft.

Aufnehmen des (sehr nützlich :) Beispiele eins nach dem anderen:

SINGLE TERM, PARTIAL

// returns nothing because there is no world word with the value `Crai` in your 
// text index and there is no whole word for which `Crai` is a recognised stem 
db.submissions.find({"$text":{"$search":"\"Crai\""}}) 

mehrerer Begriffe, COMPLETE

// returns the document because it contains all of these words 
// note in the text index Dr. Bob is not a single entry since "." is a delimiter 
db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bob\""}}) 

mehrerer Begriffe, EINE TEILE

// returns the document because it contains the whole word "Craig" and it 
// contains the whole word "Dr" 
db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}}) 

mehrerer Begriffe, beide Teil

// returns the document because it contains the whole word "Dr" 
db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}}) 

Beachten Sie, dass die $search String ...

A-Saite von Begriffen, die MongoDB analysiert und verwendet die abfragen Textindex. MongoDB führt eine logische OR Suche nach den Begriffen durch, es sei denn, sie ist als Ausdruck angegeben.

Also, wenn mindestens ein Semester lang in Ihrem $search Zeichenfolge entspricht dann paßt MongoDB das Dokument.

dieses Verhalten zu überprüfen, wenn Sie Ihr Dokument zu ändern Dr. Bob-DrBob dann die folgenden Abfragen keine Dokumente zurückkehren bearbeiten:

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}}) 
db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}}) 

Diese jetzt keine Treffer zurück, weil Dr nicht mehr ein ganzes Wort ist in Ihr Textindex, weil nicht der . Begrenzer folgt.

+0

Wow, ich danke Ihnen viel für die sehr gründliche Antwort. Ich habe eine letzte Frage zu den Textsuchen. Gibt es eine Möglichkeit, es für alle Begriffe zu 100% inklusive zu machen? Bei einigen zusätzlichen Tests bemerkte ich, dass, wenn einer der Begriffe zu einem Dokument passt, es das gesamte Dokument erfassen wird. Gibt es eine Möglichkeit, die Textsuche durchzuführen, sodass alle Begriffe übereinstimmen müssen? – user2223059

+0

MongoDB führt eine logische ODER-Suche der Begriffe durch, es sei denn, sie sind als Ausdruck angegeben. So wird eine Suche auf "der schnelle braune Hund" nur Dokumente zurückgeben, die einen Eintrag im Textindex haben, der den Ausdruck "der schnelle braune Hund" enthält, wohingegen eine Suche nach dem "schnellen" "braunen" "Hund" wird Dokumente zurücksenden, bei denen mindestens eines dieser Wörter vorhanden ist. – glytching

Verwandte Themen