از ویژگیهای جستجوی متن در Cloud Firestore برای جستجوی رشتههای خاص در یک مجموعه استفاده کنید.
قبل از اینکه شروع کنی
قبل از شروع استفاده از جستجوی متنی، موارد زیر را انجام دهید:
مطمئن شوید که به یک پایگاه داده عملیاتی سازگار با MongoDB دسترسی دارید، یا یک پایگاه داده ایجاد کنید و به آن متصل شوید .
مطمئن شوید که یک فهرست متنی دارید، یا یک فهرست متنی ایجاد کنید .
اجرای جستجوی متنی
جستجوهای متنی از عملگر $text درون یک فیلتر استفاده میکنند. رشته مورد نظر را در آرگومان $search مشخص کنید.
جستجوی متنی عمومی را اجرا کنید
برای انجام جستجوی متنی عمومی، دستور زیر را اجرا کنید:
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
اگر فهرست شما پارتیشنبندی شده باشد، میتوانید با قرار دادن پارتیشن در یک فیلتر تساوی "و" در جستجوی خود، آن را بر اساس پارتیشن فیلتر کنید. برای مثال، اگر پارتیشن city داشتید، میتوانید جستجوی متنی را به صورت زیر فیلتر کنید:
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
همچنین میتوانید یک مجموعه را بر اساس یک پارتیشن فیلتر کنید. برای مثال:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
مقدار پارتیشن شما باید یک رشته باشد. فیلتر پارتیشن شما باید با استفاده از "و" به جستجوی متنی شما متصل شود.
تنظیم زبان جستجوی متن
شما میتوانید زبان جستجوی متن را با استفاده از آرگومان $language تنظیم کنید. برای مثال:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
اگر زبانی را تنظیم نکنید، جستجو از زبان فهرست متن استفاده میکند.
جستجوی یک عبارت دقیق
برای جستجوی دقیق یک عبارت، عبارت را به صورت دنبالهای از کلمات که بین دو علامت نقل قول قرار گرفتهاند، پیکربندی کنید. برای مثال:
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
جستجوی ترکیب اصطلاحات
برای دقیقتر کردن جستجوی متن، زنجیرهای از عبارات را مشخص کنید. برای مثال، جستجوی زیر اسنادی را برمیگرداند که با ترکیب best AND french AND ("bread" OR "is") مطابقت دارند:
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
یک اصطلاح را حذف کنید
برای حذف یک عبارت از جستجوی متنی، قبل از آن عبارت، علامت خط تیره (-) قرار دهید:
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
محاسبه امتیاز مرتبط بودن
از عبارت {$meta: "textScore"} برای محاسبه امتیاز مرتبط بودن اسناد منطبق با جستجوی متن استفاده کنید. برای مرتبسازی نتایج به ترتیب نزولی امتیاز، $meta در عبارت مرتبسازی استفاده کنید. مثالهای زیر را در نظر بگیرید، که در آن SCORE_FIELD نام فیلدی است که برای ذخیره مقدار امتیاز استفاده میشود:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
همچنین میتوانید از امتیاز متن در عبارات پیشبینی استفاده کنید. برای مثال:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
جستجو را گسترش دهید
برای افزایش ارتباط نتایج جستجوی متن، عملگر $text رشته جستجو را بر اساس زبان مشخص شده افزایش میدهد تا شامل تطابقهایی برای مترادفهای آگاه از متن، ریشهیابی کلمات، اصطلاحات تصحیحشده املایی، تغییرات تفکیکی و موارد دیگر باشد.
محدودیتها
- عملگرهای
$nearو$textرا نمیتوان همزمان در جستجوی متن استفاده کرد. - برای هر جستجوی
findیاaggregation، استفاده از یک عملگر$textمجاز است. - در تجمیعها، مرحله
$matchبا$textباید اولین مرحله خط لوله باشد. -
$textفقط میتواند درون$and و$or به صورت تو در تو تعریف شود. - اگر
$text داخل$or باشد، فصلهای غیر جستجو ممکن است از فهرستهای مرتب موجود برای بهینهسازی جستجو استفاده کنند. اگر فصلهای دیگر فهرستبندی نشده باشند، جستجو به اسکن مجموعه متکی است. - نمیتوان از
$textبه همراه راهنما (hint) استفاده کرد. - کوئریهایی که جستجوی متنی دارند نمیتوانند بر اساس
$naturalمرتب شوند.