Recherche floue dans MongoDB
- Qu’est-ce que la recherche floue
- Créer une collection d’échantillons dans MongoDB
-
Utilisez l’opérateur
$regex
pour effectuer une recherche floue dans MongoDB -
Utilisez la requête
$text
pour effectuer une recherche floue dans MongoDB -
Utilisez la bibliothèque
Fuse.js
de JavaScript pour effectuer une 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.