در این فصل، ما جستجوی متن کامل MongoDB را معرفی خواهیم کرد که با عملکرد متفاوتی از اپراتور "like" در SQL استفاده میکند. جستجوی متن کامل MongoDB برای جستجوی متنی مقایسهای با پیادهسازی "like" در SQL بهترین عملکرد را ارائه میدهد.
آمادهسازی دادههای آزمایشی
درج چند رکورد در مجموعه stores
db.stores.insert(
[
{ _id: 1, name: "جاوا هات", description: "قهوه و کیک" },
{ _id: 2, name: "پنبر بانز", description: "همبرگرهای متخصص" },
{ _id: 3, name: "کافی شاپ", description: "تنها قهوه" },
{ _id: 4, name: "لباس لباس لباس", description: "لباسهای تخفیفی" },
{ _id: 5, name: "خرید جاوا", description: "کالاهای اندونزیایی" }
]
)
ایجاد شاخص متنی
برای استفاده از قابلیت جستجوی متنی، شما باید یک شاخص متنی ایجاد کنید. مثال:
db.stores.createIndex( { name: "text", description: "text" } )
توضیحات:
- ایجاد یک شاخص نوع متنی برای فیلدهای نام و توضیحات.
توجه: یک مجموعه فقط اجازه یک شاخص متنی را میدهد، اما یک شاخص متنی میتواند شامل چندین فیلد باشد.
اپراتور $text
استفاده از اپراتور $text برای جستجوی متنی.
سینتکس:
{ $text: { $search: "کلمات کلیدی جستجو" } }
مثال:
db.stores.find( { $text: { $search: "جاوا کافه شاپ" } } )
توضیحات:
- جستجوی اسناد حاوی کلمات کلیدی "قهوه"، "شاپ" و "جاوا" در فیلدهای نام و توضیحات.
خروجی:
{ "_id" : 3, "name" : "کافی شاپ", "description" : "تنها قهوه" }
{ "_id" : 1, "name" : "جاوا هات", "description" : "قهوه و کیک" }
{ "_id" : 5, "name" : "خرید جاوا", "description" : "کالاهای اندونزیایی" }
جستجوی عبارت
db.stores.find( { $text: { $search: "\"کافه شاپ\"" } } )
خروجی
{ "_id" : 3, "name" : "کافی شاپ", "description" : "تنها قهوه" }
مرتبسازی مرتبطیت
بهطور پیشفرض، نتایج یک پرس و جوی $text مرتب نیستند. پرس و جوی $text امتیاز (textScore) مرتبطیت هر سند را محاسبه میکند. ما میتوانیم از این امتیاز برای مرتبسازی و نمایش اسناد با مرتبطیت بالاتر استفاده کنیم.
db.stores.find(
{ $text: { $search: "جاوا کافه شاپ" } },
{ score: { $meta: "textScore" } } // اعلام میکند که امتیاز مرتبطیت textScore را برگرداند
).sort( { score: { $meta: "textScore" } } ) // مشخص کردن مرتبسازی با استفاده از textScore
توجه: جستجوی متنی MongoDB پشتیبانی خوبی از عبارتهای چینی ندارد.