استفاده از جستجوی متنی

از ویژگی‌های جستجوی متن در Cloud Firestore برای جستجوی رشته‌های خاص در یک مجموعه استفاده کنید.

قبل از اینکه شروع کنی

قبل از شروع استفاده از جستجوی متنی، موارد زیر را انجام دهید:

  1. مطمئن شوید که به یک پایگاه داده عملیاتی سازگار با MongoDB دسترسی دارید، یا یک پایگاه داده ایجاد کنید و به آن متصل شوید .

  2. مطمئن شوید که یک فهرست متنی دارید، یا یک فهرست متنی ایجاد کنید .

جستجوهای متنی از عملگر $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 مرتب شوند.