يعد mongoose-fuzzy-searching مكونًا إضافيًا بسيطًا وخفيف الوزن يتيح البحث الغامض في المستندات في MongoDB. يعتمد هذا الرمز على هذه المقالة.
التثبيت باستخدام npm
$ npm i mongoose-fuzzy-searching
أو باستخدام الغزل
$ yarn add mongoose-fuzzy-searching
قبل البدء، للحصول على أفضل الممارسات وتجنب أي مشكلات، تعامل بشكل صحيح مع جميع تحذيرات الإيقاف.
للسماح للمكون الإضافي بإنشاء الفهارس، تحتاج إلى ضبط useCreateIndex
على true. يوضح المثال أدناه كيفية الاتصال بقاعدة البيانات.
const options = {
useNewUrlParser : true ,
useUnifiedTopology : true ,
useFindAndModify : false ,
useCreateIndex : true ,
} ;
mongoose . Promise = global . Promise ;
return mongoose . connect ( URL , options ) ;
في المثال أدناه، لدينا مجموعة User
ونريد إجراء بحث غامض في firstName
والاسم lastName
.
const { Schema } = require ( 'mongoose' ) ;
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
email : String ,
age : Number ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , { fields : [ 'firstName' , 'lastName' ] } ) ;
const User = mongoose . model ( 'User' , UserSchema ) ;
module . exports = { User } ;
const user = new User ( { firstName : 'Joe' , lastName : 'Doe' , email : '[email protected]' , age : 30 } ) ;
try {
await user . save ( ) ; // mongodb: { ..., firstName_fuzzy: [String], lastName_fuzzy: [String] }
const users = await User . fuzzySearch ( 'jo' ) ;
console . log ( users ) ;
// each user object will not contain the fuzzy keys:
// Eg.
// {
// "firstName": "Joe",
// "lastName": "Doe",
// "email": "[email protected]",
// "age": 30,
// "confidenceScore": 34.3 ($text meta score)
// }
} catch ( e ) {
console . error ( e ) ;
}
يتم فرز النتائج حسب مفتاح confidenceScore
. يمكنك تجاوز هذا الخيار.
try {
const users = await User . fuzzySearch ( 'jo' ) . sort ( { age : - 1 } ) . exec ( ) ;
console . log ( users ) ;
} catch ( e ) {
console . error ( e ) ;
}
يمكن أن تحتوي الخيارات على fields
وبرامج middlewares
.
تعتبر سمة الحقول إلزامية ويجب أن تكون إما مجموعة من Strings
أو مجموعة من Objects
.
إذا كنت تريد استخدام الخيارات الافتراضية لجميع حقولك، فيمكنك فقط تمريرها كسلسلة.
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
email : String ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , { fields : [ 'firstName' , 'lastName' ] } ) ;
في حالة رغبتك في تجاوز أي من الخيارات الافتراضية للوسائط الخاصة بك، يمكنك إضافتها ككائن وتجاوز أي من القيم التي تريدها. يحتوي الجدول أدناه على المفاتيح المتوقعة لهذا الكائن.
مفتاح | يكتب | تقصير | وصف |
---|---|---|---|
اسم | خيط | باطل | اسم مفتاح المجموعة |
minSize | عدد صحيح | 2 | N-جرام الحجم الأدنى. اعرف المزيد عن N-gram |
وزن | عدد صحيح | 1 | يدل على أهمية الحقل بالنسبة للحقول المفهرسة الأخرى من حيث درجة البحث عن النص. تعرف على المزيد حول أوزان المؤشرات |
prefixOnly | منطقية | خطأ شنيع | قم بإرجاع ngrams فقط من بداية الكلمة. (يعطي نتائج أكثر دقة) |
escapeSpecialCharacters | منطقية | حقيقي | قم بإزالة الأحرف الخاصة من N-gram. |
مفاتيح | صفيف [سلسلة] | باطل | إذا كان نوع سمة المجموعة هو Object أو [Object] (انظر المثال)، فيمكنك تحديد السمات التي سيتم استخدامها للبحث الغامض |
مثال:
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
email : String ,
content : {
en : String ,
de : String ,
it : String
}
text : [
{
title : String ,
description : String ,
language : String ,
} ,
] ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , {
fields : [
{
name : 'firstName' ,
minSize : 2 ,
weight : 5 ,
} ,
{
name : 'lastName' ,
minSize : 3 ,
prefixOnly : true ,
} ,
{
name : 'email' ,
escapeSpecialCharacters : false ,
} ,
{
name : 'content' ,
keys : [ 'en' , 'de' , 'it' ] ,
} ,
{
name : 'text' ,
keys : [ 'title' , 'language' ] ,
} ,
] ,
} ) ;
تعد البرامج الوسيطة Object
اختياريًا يمكن أن يحتوي على برامج وسيطة pre
مخصصة. يستخدم هذا البرنامج المساعد هذه البرامج الوسيطة لإنشاء العناصر الغامضة أو تحديثها. وهذا يعني أنه إذا قمت بإضافة برامج وسيطة pre
، فلن يتم استدعاؤها أبدًا نظرًا لأن المكون الإضافي يتجاوزها. لتجنب هذه المشكلة، يمكنك تمرير البرامج الوسيطة المخصصة الخاصة بك إلى البرنامج الإضافي. سيتم استدعاء البرامج الوسيطة الخاصة بك أولاً . البرامج الوسيطة التي يمكنك تمريرها هي:
schema.pre("save", ...)
schema.pre("insertMany", ...)
schema.pre("update", ...)
schema.pre("updateOne", ...)
schema.pre("findOneAndUpdate", ...)
schema.pre("updateMany", ...)
إذا كنت تريد إضافة أي من البرامج الوسيطة المذكورة أعلاه، فيمكنك إضافتها مباشرة إلى البرنامج الإضافي.
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , {
fields : [ 'firstName' ] ,
middlewares : {
preSave : function ( ) {
// do something before the object is saved
} ,
} ,
} ) ;
يمكن أن تكون البرامج الوسيطة أيضًا وظائف غير متزامنة:
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , {
fields : [ 'firstName' ] ,
middlewares : {
preUpdateOne : async function {
// do something before the object is updated (asynchronous)
}
}
} ) ;
يمكن استخدام استعلام البحث الغامض إما كوظيفة static
، أو helper
، مما يتيح لك ربط استعلامات متعددة معًا. اسم الوظيفة في كلتا الحالتين هو مفاجأة، مفاجأة، fuzzySearch
.
يمكن أن تقبل طريقة المثيل ما يصل إلى ثلاث معلمات. الأول هو الاستعلام، والذي يمكن أن يكون إما String
أو Object
. هذه المعلمة مطلوبة . يمكن أن تكون المعلمة الثانية إما Object
يحتوي على أي استعلامات إضافية (على سبيل المثال، age: { $gt: 18 }
)، أو وظيفة رد اتصال. إذا كانت المعلمة الثانية هي الاستعلامات، فإن المعلمة الثالثة هي وظيفة رد الاتصال. إذا لم تقم بتعيين وظيفة رد اتصال، فسيتم إرجاع النتائج داخل ملف Promise.
يحتوي الجدول أدناه على المفاتيح المتوقعة للمعلمة الأولى (إذا كانت كائنًا)
مفتاح | يكتب | com.deafult | وصف |
---|---|---|---|
استفسار | خيط | باطل | سلسلة للبحث |
minSize | عدد صحيح | 2 | N-جرام الحجم الأدنى. |
prefixOnly | منطقية | خطأ شنيع | قم بإرجاع ngrams فقط من بداية الكلمة. (يعطي نتائج أكثر دقة) البادئة |
بالضبط | منطقية | خطأ شنيع | التطابقات على عبارة، بدلاً من المصطلحات الفردية |
مثال:
/* With string that returns a Promise */
User . fuzzySearch ( 'jo' ) . then ( console . log ) . catch ( console . error ) ;
/* With additional options that returns a Promise */
User . fuzzySearch ( { query : 'jo' , prefixOnly : true , minSize : 4 } )
. then ( console . log )
. catch ( console . error ) ;
/* With additional queries that returns a Promise */
User . fuzzySearch ( 'jo' , { age : { $gt : 18 } } )
. then ( console . log )
. catch ( console . error ) ;
/* With string and a callback */
User . fuzzySearch ( 'jo' , ( err , doc ) => {
if ( err ) {
console . error ( err ) ;
} else {
console . log ( doc ) ;
}
} ) ;
/* With additional queries and callback */
User . fuzzySearch ( 'jo' , { age : { $gt : 18 } } , ( err , doc ) => {
if ( err ) {
console . error ( err ) ;
} else {
console . log ( doc ) ;
}
} ) ;
يمكنك أيضًا استخدام الاستعلام كوظيفة مساعدة، وهي تشبه طرق المثيل ولكن للاستعلامات النمسية. تتيح لك أساليب مساعد الاستعلام توسيع واجهة برمجة تطبيقات منشئ الاستعلامات القابلة للتسلسل الخاصة بـ mongoose.
يمكن لمساعد الاستعلام قبول ما يصل إلى معلمتين. الأول هو الاستعلام، والذي يمكن أن يكون إما String
أو Object
. هذه المعلمة مطلوبة . يمكن أن تكون المعلمة الثانية Object
يحتوي على أي استعلامات إضافية (على سبيل المثال، age: { $gt: 18 }
)، وهو أمر اختياري. لا يقبل هذا المساعد وظيفة رد الاتصال. إذا قمت بتمرير دالة فسوف يلقي خطأ. المزيد عن مساعدي الاستعلام.
مثال:
const user = await User . find ( { age : { $gte : 30 } } )
. fuzzySearch ( 'jo' )
. exec ( ) ;
يقوم البرنامج المساعد بإنشاء فهارس للحقول المحددة. في المثال أدناه، ستكون الفهارس الجديدة هي firstName_fuzzy
و lastName_fuzzy
. أيضًا، سيحتوي كل مستند على الحقلين firstName_fuzzy
[String] و lastName_fuzzy
[String]. ستحتوي هذه المصفوفات على الجناس الناقصة للحقول المحددة.
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
email : String ,
age : Number ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , { fields : [ 'firstName' , 'lastName' ] } ) ;
بمعنى آخر، يقوم هذا البرنامج الإضافي بإنشاء الجناس الناقصة عند إنشاء مستند أو تحديثه. لن تحتوي جميع المستندات الموجودة مسبقًا على هذه المصفوفات الغامضة، لذا لن تتمكن وظيفة fuzzySearch
من العثور عليها.
من أجل إنشاء الجناس الناقصة للمستندات الموجودة مسبقًا، يجب عليك تحديث كل مستند. يقوم المثال أدناه بتحديث سمة firstName
لكل مستند في المجموعة User
.
const cursor = Model . find ( ) . cursor ( ) ;
cursor . next ( function ( error , doc ) {
const obj = attrs . reduce ( ( acc , attr ) => ( { ... acc , [ attr ] : doc [ attr ] } ) , { } ) ;
return Model . findByIdAndUpdate ( doc . _id , obj ) ;
} ) ;
في المثال السابق، قمنا بتعيين firstName
واسم lastName
كسمات غامضة. إذا قمت بإزالة الاسم firstName
من الحقول الغامضة، فلن تتم إزالة صفيف firstName_fuzzy
بواسطة المجموعة. إذا كنت تريد إزالة المصفوفة الموجودة في كل مستند، فيجب عليك إلغاء تعيين هذه القيمة.
const cursor = Model . find ( ) . cursor ( ) ;
cursor . next ( function ( error , doc ) {
const $unset = attrs . reduce ( ( acc , attr ) => ( { ... acc , [ ` ${ attr } _fuzzy` ] : 1 } ) , { } ) ;
return Model . findByIdAndUpdate ( data . _id , { $unset } , { new : true , strict : false } ) ;
} ) ;
نحن نستخدم jest لجميع اختبارات الوحدة والتكامل.
$ npm test
ملاحظة: سيؤدي هذا إلى تشغيل جميع الأجنحة بشكل تسلسلي لتجنب الاتصال المتزامن المتعدد على قاعدة البيانات.
سيؤدي هذا إلى تشغيل الاختبارات باستخدام قاعدة بيانات الذاكرة. إذا كنت ترغب لأي سبب من الأسباب في إجراء الاختبارات باستخدام اتصال فعلي على نسخة mongo، أضف متغير البيئة MONGO_DB
:
$ docker run --name mongo_fuzzy_test -p 27017:27017 -d mongo
$ MONGO_DB=true npm test
$ npm run test:unit
$ npm run test:integration
رخصة معهد ماساتشوستس للتكنولوجيا
حقوق الطبع والنشر (ج) 2019 لصالح فاسيليس بالاس
يُمنح الإذن مجانًا لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج")، للتعامل في البرنامج دون قيود، بما في ذلك، على سبيل المثال لا الحصر، حقوق الاستخدام والنسخ والتعديل والدمج. ونشر و/أو توزيع وترخيص من الباطن و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين تم توفير البرنامج لهم بالقيام بذلك، وفقًا للشروط التالية:
يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك، على سبيل المثال لا الحصر، ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. لا يتحمل المؤلفون أو أصحاب حقوق الطبع والنشر بأي حال من الأحوال المسؤولية عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في إجراء العقد أو الضرر أو غير ذلك، الناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو المعاملات الأخرى في برمجة.