5

Env:MongoDB Voll- und Teiltextsuche

  • MongoDB (3.2.0) mit Mongos

Collection:

  • Benutzer

Text Indexerstellung:

BasicDBObject keys = new BasicDBObject(); 
    keys.put("name","text"); 

    BasicDBObject options = new BasicDBObject(); 
    options.put("name", "userTextSearch"); 
    options.put("unique", Boolean.FALSE); 
    options.put("background", Boolean.TRUE); 

    userCollection.createIndex(keys, options); // using MongoTemplate 

Dokument:

  • { "name": "LEONEL"}

Abfragen:

  • db.users.find({ "$text" : { "$search" : "LEONEL" } }) => GEFUNDEN
  • db.users.find({ "$text" : { "$search" : "leonel" } }) => FOUND (Suche casesensitive ist falsch)
  • db.users.find({ "$text" : { "$search" : "LEONÉL" } }) => FOUND (Suche mit diacriticSensitive ist false)
  • db.users.find({ "$text" : { "$search" : "LEONE" } }) => FOUND (Teilsuche)
  • db.users.find({ "$text" : { "$search" : "LEO" } }) => NOT FOUND (Teilsuche)
  • db.users.find({ "$text" : { "$search" : "L" } }) => NOT FOUND (Teilsuche)

Eine Idee, warum ich 0 Ergebnisse als Abfrage "LEO" oder "L" erhalten?

Regex mit Textindex Suche ist nicht erlaubt.

db.getCollection('users') 
    .find({ "$text" : { "$search" : "/LEO/i", 
          "$caseSensitive": false, 
          "$diacriticSensitive": false }}) 
    .count() // 0 results 

db.getCollection('users') 
    .find({ "$text" : { "$search" : "LEO", 
          "$caseSensitive": false, 
          "$diacriticSensitive": false }}) 
.count() // 0 results 

Mongo Dokumentation:

+0

Mögliches Duplikat [MongoDB: Ist es möglich, eine Groß- und Kleinschreibung Abfrage zu machen?] (Https://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case- insensitive-query) –

+0

Diese Frage bezieht sich auf die teilweise Suche mit einem Textindex und nicht auf Groß- und Kleinschreibung. @ LucasCosta bitte diese Frage nicht als dupliziert markieren. – Leonel

+0

Es ist möglich, benötigt mindestens 5 Stimmen @Leonel –

Antwort

10

Wie bei MongoDB 3.4, dieDie-Funktion unterstützt die Suche nach Groß- und Kleinschreibung bei Textinhalten mit sprachspezifischen Regeln für Stoppwörter und Stemming. Stemming-Regeln für supported languages basieren auf Standardalgorithmen, die allgemein gebräuchliche Verben und Substantive behandeln, sich jedoch nicht der Eigennamen bewusst sind.

Es gibt keine explizite Unterstützung für partielle oder Fuzzy-Matches, aber Begriffe, die zu einem ähnlichen Ergebnis führen, scheinen so zu funktionieren. Zum Beispiel: "Geschmack", "Geschmäcker", und geschmackvolle "alle Stiel zu" Geschmack. Versuchen Sie die Snowball Stemming Demo Seite mit mehr Wörtern und Stemming-Algorithmen zu experimentieren.

Ihre Ergebnisse, die übereinstimmen, sind alle Variationen desselben Wortes " LEONEL ", und variieren nur von Fall zu Fall und diakritisch. Wenn nicht" LEONEL "durch die Regeln Ihrer gewählten Sprache auf etwas kürzer gehalten werden kann, sind dies die einzigen Arten von Variationen, die übereinstimmen.

Wenn Sie effiziente Teilübereinstimmungen durchführen möchten, müssen Sie einen anderen Ansatz wählen. Für einige hilfreiche Ideen sehen:

Es gibt eine relevante Verbesserung Anfrage Sie/upvote in der MongoDB issue tracker beobachten kann: SERVER-15090: Improve Text Indexes to support partial word match.