Fuzzy-Suche in MongoDB

Mehvish Ashiq 16 Februar 2024
  1. Was ist Fuzzy-Suche
  2. Erstellen Sie eine Beispielsammlung in MongoDB
  3. Verwendung des $regex-Operators zur Durchführung einer unscharfen Suche in MongoDB
  4. Verwendung der Abfrage $text zur Durchführung einer unscharfen Suche in MongoDB
  5. Verwenden Sie die Fuse.js-Bibliothek von JavaScript, um eine Fuzzy-Suche in MongoDB durchzuführen
Fuzzy-Suche in MongoDB

Heute werden wir die Fuzzy-Suche besprechen und wie wir eine Fuzzy-Suche mit MongoDB durchführen können.

Wir beginnen mit der Verwendung des Operators $regex und der Abfrage $text. Darüber hinaus werden wir die Verwendung einer JavaScript-Bibliothek namens Fuse.js erlernen, um eine Fuzzy-Suche in den Dokumenten durchzuführen.

Was ist Fuzzy-Suche

Mit der Fuzzy-Suche können wir einen Text suchen, der nicht genau, aber sehr gut mit dem Begriff übereinstimmt. Es ist nützlich, relevante Ergebnisse zu finden, selbst wenn die Suchbegriffe falsch geschrieben sind.

Beispielsweise zeigt uns Google verschiedene Webseiten an, die für unseren gesuchten Begriff relevant sind, selbst wenn wir uns vertippt haben. Die Verwendung von regulären Ausdrücken (auch Regex genannt) ist ebenfalls ein sehr vorteilhafter und zeitsparender Ansatz zur Implementierung einer Fuzzy-Suche.

Erstellen Sie eine Beispielsammlung in MongoDB

Wir werden von den Grundstufen bis zu den fortgeschrittenen Stufen beginnen, um die Fuzzy-Suche zu lernen. Um dies zu üben, erstellen wir eine Beispielsammlung mit dem Namen Sammlung_Eins, die ein Feld für jedes Dokument hat, nämlich den Namen.

Die _id wird automatisch erstellt; wir müssen das nicht erstellen. Sie können die folgenden Abfragen verwenden, um dasselbe zu tun.

Beispielcode:

> db.createCollection('collection_one')
> db.collection_one.insertMany([
    { name : 'Mehvish Ashiq'},
    { name : 'Jennifer Johnson'},
    { name : 'Natalie Robinson'},
    { name : 'John Ferguson'},
    { name : 'Samuel Patterson'},
    { name : 'Salvatore Callahan'},
    { name : 'Mikaela Christensen'}
])
> db.collection_one.find()

AUSGANG:

{ "_id" : ObjectId("62939a37b3a0d806d251ddae"), "name" : "Mehvish Ashiq" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddaf"), "name" : "Jennifer Johnson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb0"), "name" : "Natalie Robinson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb1"), "name" : "John Ferguson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb3"), "name" : "Salvatore Callahan" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb4"), "name" : "Mikaela Christensen" }

Verwendung des $regex-Operators zur Durchführung einer unscharfen Suche in MongoDB

Beispielcode:

> db.collection_one.find({"name": /m/})

AUSGANG:

{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }

In diesem Code haben wir eine Fuzzy-Suche im Feld name durchgeführt und alle Dokumente abgerufen, in denen das Feld name den Buchstaben m enthält.

Wie Sie sehen können, haben wir nur einen Datensatz mit dem Buchstaben m, aber es gibt zwei weitere Dokumente, die mit M (Großbuchstabe) beginnen. Um dies zu handhaben, können wir wie folgt das i Modifikator verwenden, das die Suche ohne Berücksichtigung der Groß-/Kleinschreibung durchführt.

Beispielcode:

> db.collection_one.find({"name": /m/i})

AUSGANG:

{ "_id" : ObjectId("62939a37b3a0d806d251ddae"), "name" : "Mehvish Ashiq" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb4"), "name" : "Mikaela Christensen" }

Es hat sich gezeigt, dass es sehr wichtig ist, einen korrekt entworfenen regulären Ausdruck zu haben; Andernfalls erhalten wir möglicherweise irreführende Ergebnisse. Das Gleiche können wir auch auf folgende Weise tun.

Beispielcode (Suche ohne Berücksichtigung der Groß-/Kleinschreibung):

> db.collection_one.find({'name': {'$regex': 'm','$options': 'i'}})

AUSGANG:

{ "_id" : ObjectId("62939a37b3a0d806d251ddae"), "name" : "Mehvish Ashiq" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb4"), "name" : "Mikaela Christensen" }

Ebenso können wir alle Dokumente erhalten, bei denen der name mit einer Kombination aus zwei Buchstaben als on endet.

Beispielcode:

> db.collection_one.find({name:{'$regex' : 'on$', '$options' : 'i'}})

AUSGANG:

{ "_id" : ObjectId("62939a37b3a0d806d251ddaf"), "name" : "Jennifer Johnson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb0"), "name" : "Natalie Robinson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb1"), "name" : "John Ferguson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }

Verwendung der Abfrage $text zur Durchführung einer unscharfen Suche in MongoDB

Die Abfrage $text funktioniert nicht bei unserer Beispielsammlung mit dem Namen collection_one, da diese keinen Textindex hat. Also erstellen wir den Index wie folgt.

Beispielcode:

> db.collection_one.createIndex({name:"text"});

Die obige Anweisung erstellt auch die angegebene Sammlung, falls sie noch nicht vorhanden ist. Denken Sie daran, dass wir einen Index für ein oder mehrere Felder erstellen können, die durch ein Komma getrennt sind.

Siehe folgendes Beispiel.

db.collection_name.createIndex({name:"text", description:"text"});

Sobald der Index erstellt ist, können wir eine Fuzzy-Suche wie unten angegeben durchführen.

Beispielcode:

> db.collection_one.find({ $text: { $search: "Mehvish" } } )

AUSGANG:

{ "_id" : ObjectId("62939a37b3a0d806d251ddae"), "name" : "Mehvish Ashiq" }

Verwenden Sie die Fuse.js-Bibliothek von JavaScript, um eine Fuzzy-Suche in MongoDB durchzuführen

Beispielcode (der Dateicode fuzzysearch.js):

const Fuse = require('fuse.js')
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/';

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  var dbo = db.db('FuseFuzzySearch');

  var personObj = [
    {name: 'Mehvish Ashiq'}, {name: 'Jennifer Johnson'},
    {name: 'Natalie Robinson'}, {name: 'John Ferguson'},
    {name: 'Samuel Patterson'}, {name: 'Salvatore Callahan'},
    {name: 'Mikaela Christensen'}
  ];

  dbo.collection('person').insertMany(personObj, function(err, res) {
    if (err) throw err;
  });

  const options = {includeScore: true, keys: ['name']}

  const fuse = new Fuse(personObj, options);
  const result = fuse.search('jahson');
  console.log(result);
  db.close();
});

AUSGANG:

[
  {
    item: { name: 'Jennifer Johnson', _id: 6293aa0340aa3b21483d9885 },
    refIndex: 1,
    score: 0.5445835311565898
  },
  {
    item: { name: 'John Ferguson', _id: 6293aa0340aa3b21483d9887 },
    refIndex: 3,
    score: 0.612592665952338
  },
  {
    item: { name: 'Natalie Robinson', _id: 6293aa0340aa3b21483d9886 },
    refIndex: 2,
    score: 0.6968718698752637
  },
  {
    item: { name: 'Samuel Patterson', _id: 6293aa0340aa3b21483d9888 },
    refIndex: 4,
    score: 0.6968718698752637
  }
]

In diesem Codebeispiel haben wir zuerst die Bibliothek fuse.js importiert. Als nächstes haben wir uns mit MongoDB verbunden.

Wenn es aus irgendeinem Grund nicht verbunden ist, wird ein Fehler ausgegeben. Andernfalls erstellen Sie eine Datenbank namens FuseFussySearch.

Erstellen Sie dann ein Objekt namens personObj, das alle Dokumente enthält, die wir in die Sammlung person einfügen möchten. Wenn beim Einfügen der Daten ein Problem auftritt, wird ein Fehler generiert.

Erstellen Sie das Objekt Fuse, übergeben Sie das Array der Objekte personObj und options mit keys und includeScore, um die Fuzzy-Suche durchzuführen und die Ergebnisse wie oben angegeben zu erhalten.

Hier geben die Schlüssel die Felder an, auf denen die Suche durchgeführt wird. Der includeScore ist optional, aber besser, weil er den Matching Score angibt.

Wenn es 0 ist, findet das Programm die perfekte Übereinstimmung, während eine Punktzahl von 1 die vollständige Nichtübereinstimmung anzeigt. Alle Optionen finden Sie hier.

Vergessen Sie zum Schluss nicht, die Verbindung zu schließen. Es gibt viele andere Bibliotheken, die Sie ebenfalls erkunden können.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook