Recherche floue dans MongoDB

Mehvish Ashiq 16 février 2024
  1. Qu’est-ce que la recherche floue
  2. Créer une collection d’échantillons dans MongoDB
  3. Utilisez l’opérateur $regex pour effectuer une recherche floue dans MongoDB
  4. Utilisez la requête $text pour effectuer une recherche floue dans MongoDB
  5. Utilisez la bibliothèque Fuse.js de JavaScript pour effectuer une recherche floue dans MongoDB
Recherche floue dans MongoDB

Aujourd’hui, nous discuterons de la recherche floue et de la manière dont nous pouvons effectuer une recherche floue à l’aide de MongoDB.

Nous allons commencer par utiliser l’opérateur $regex et la requête $text. De plus, nous nous dirigerons vers l’apprentissage de l’utilisation d’une librairie JavaScript nommée Fuse.js pour faire une recherche floue sur les documents.

Qu’est-ce que la recherche floue

En utilisant la recherche floue, nous pouvons rechercher un texte qui ne correspond pas exactement mais qui correspond étroitement au terme. Il est utile de trouver des résultats pertinents même lorsque les termes de recherche sont mal orthographiés.

Par exemple, Google nous montre diverses pages Web pertinentes pour notre terme recherché, même en cas de faute de frappe. L’utilisation d’expressions régulières (également appelées regex) est également une approche très bénéfique et rapide pour la mise en œuvre d’une recherche floue.

Créer une collection d’échantillons dans MongoDB

Nous allons commencer du niveau de base au niveau avancé pour apprendre la recherche floue. Pour le mettre en pratique, créons un exemple de collection nommé collection_one qui a un champ pour chaque document, qui est le name.

Le _id est automatiquement créé ; nous n’avons pas à créer cela. Vous pouvez utiliser les requêtes suivantes pour faire de même.

Exemple de code :

> 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()

PRODUCTION:

{ "_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" }

Utilisez l’opérateur $regex pour effectuer une recherche floue dans MongoDB

Exemple de code :

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

PRODUCTION:

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

Dans ce code, nous avons effectué une recherche floue sur le champ name et récupéré tous les documents où le champ name contient la lettre m.

Comme vous pouvez le voir, nous n’avons qu’un seul enregistrement contenant la lettre m, mais il y a deux autres documents qui commencent par m (lettre majuscule). Pour gérer cela, nous pouvons utiliser le i modificateur comme suit, qui effectue la recherche insensible à la casse.

Exemple de code :

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

PRODUCTION:

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

Cela a montré qu’il est très important d’avoir une expression régulière correctement conçue ; sinon, nous pourrions obtenir des résultats trompeurs. Nous pouvons également faire la même chose de la manière suivante.

Exemple de code (recherche insensible à la casse) :

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

PRODUCTION:

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

De même, on peut obtenir tous les documents dont le name se termine par une combinaison de deux lettres comme on.

Exemple de code :

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

PRODUCTION:

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

Utilisez la requête $text pour effectuer une recherche floue dans MongoDB

La requête $text ne fonctionnera pas sur notre exemple de collection nommée collection_one car elle n’a pas l’index de texte. Donc, nous créons l’index comme suit.

Exemple de code :

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

L’instruction ci-dessus créera également la collection spécifiée si elle n’existe pas déjà. N’oubliez pas que nous pouvons créer un index sur un ou plusieurs champs séparés par une virgule.

Voir l’exemple suivant.

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

Une fois l’index créé, nous pouvons effectuer une recherche floue comme indiqué ci-dessous.

Exemple de code :

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

PRODUCTION:

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

Utilisez la bibliothèque Fuse.js de JavaScript pour effectuer une recherche floue dans MongoDB

Exemple de code (le code du fichier 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();
});

PRODUCTION:

[
  {
    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
  }
]

Dans cet exemple de code, nous avons d’abord importé la bibliothèque fuse.js. Ensuite, nous nous sommes connectés à MongoDB.

S’il n’est pas connecté pour une raison quelconque, génère une erreur. Sinon, créez une base de données nommée FuseFussySearch.

Ensuite, créez un objet nommé personObj contenant tous les documents que nous voulons insérer dans la collection person. Une erreur sera générée en cas de problème lors de l’insertion des données.

Créez l’objet de Fuse, passez le tableau d’objets personObj et options ayant des keys et includeScore pour effectuer la recherche floue et obtenir les résultats, comme indiqué ci-dessus.

Ici, les keys précisent les champs sur lesquels la recherche sera effectuée. Le includeScore est facultatif, mais il est préférable de l’avoir car il indique le score correspondant.

Si c’est 0, le programme trouve la correspondance parfaite, tandis qu’un score de 1 montre la discordance complète. Vous pouvez trouver toutes les options ici.

Enfin, n’oubliez pas de fermer la connexion. Il existe de nombreuses autres bibliothèques que vous pouvez également explorer.

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