Mengisih Mengikut Skor Teks Dengan $meta
Pelajar akan mengunjurkan dan mengisih mengikut textScore untuk memaparkan dokumen paling relevan di bahagian atas hasil.
Mengisih Mengikut Skor Teks Dengan $meta ialah pelajaran MongoDB Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran MongoDB Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus MongoDB Academy merangkumi sejumlah 4 pelajaran.
Apakah textScore?
Apabila pertanyaan $text dijalankan, MongoDB mengira skor kerelevanan bagi setiap dokumen yang sepadan, yang dipanggil textScore. Skor ini menunjukkan sejauh mana dokumen sepadan dengan istilah carian: lebih banyak kemunculan istilah carian, padanan dalam medan dengan pemberat lebih tinggi dan padanan token yang lebih jarang semuanya meningkatkan skor. Secara lalai, hasil tidak diisih mengikut skor; anda perlu meminta pengisihan itu secara jelas.
Memproyeksikan textScore Dengan $meta
Untuk memasukkan skor kerelevanan dalam hasil anda, tambahkan medan unjuran menggunakan { $meta: 'textScore' }. Anda boleh menamakan medan ini mengikut kehendak anda (biasanya score). Ungkapan $meta membaca metadata yang dikira semasa pelaksanaan pertanyaan—textScore ialah satu-satunya nilai metadata yang disokong pada masa ini dalam konteks ini.
db.articles.find(
{ $text: { $search: 'mongodb performance' } },
{
title: 1,
score: { $meta: 'textScore' } // project the relevance score
}
);Mengisih Mengikut textScore
Untuk mengisih hasil mengikut kerelevanan, hantarkan { score: { $meta: 'textScore' } } kepada .sort(). MongoDB mengisih dalam tertib menurun secara lalai untuk textScore (kerelevanan tertinggi dahulu). Anda mesti memproyeksikan medan skor dalam pertanyaan yang sama apabila mengisih mengikutnya—jika anda mengabaikan unjuran tersebut, MongoDB masih akan mengisih dengan betul tetapi tidak akan memulangkan nilai skor kepada klien.
db.articles
.find(
{ $text: { $search: 'mongodb performance index' } },
{ title: 1, score: { $meta: 'textScore' } }
)
.sort({ score: { $meta: 'textScore' } });
// Results ordered: most relevant firstCara textScore Dikira
textScore MongoDB adalah berdasarkan varian logik TF-IDF (Kekerapan Istilah – Kekerapan Dokumen Songsang). Kekerapan istilah: dokumen yang mengandungi perkataan carian sebanyak 10 kali mendapat skor lebih tinggi berbanding dokumen yang mengandunginya sekali. Pemberat medan: padanan dalam medan dengan pemberat 10 mendapat skor 10× lebih tinggi berbanding padanan dalam medan dengan pemberat 1. Kepadatan indeks: perkataan yang lebih jarang dan muncul dalam lebih sedikit dokumen menyumbang lebih banyak kepada skor berbanding perkataan yang sangat lazim.
// Index with weights: title matches count more
db.articles.createIndex(
{ title: 'text', body: 'text' },
{ weights: { title: 10, body: 1 } }
);
// A document where 'mongodb' appears in the title
// scores 10x higher than one where it only appears in the body$meta dalam Saluran Paip Pengagregatan
Dalam saluran paip pengagregatan, gunakan { $meta: 'textScore' } di dalam peringkat $addFields atau $project untuk melampirkan skor, kemudian salurkan kepada $sort. Ingat: peringkat $match dengan $text mesti berada di awal saluran paip supaya MongoDB dapat mengira skor sebelum peringkat lain mengubah aliran dokumen.
db.articles.aggregate([
{ $match: { $text: { $search: 'nosql tutorial' } } },
{ $addFields: { score: { $meta: 'textScore' } } },
{ $sort: { score: -1 } },
{ $limit: 5 },
{ $project: { _id: 0, title: 1, score: 1 } }
]);Menggabungkan Isihan textScore Dengan Isihan Lain
Anda boleh menggabungkan pengisihan textScore dengan kunci isihan lain. Sebagai contoh, isih mengikut kerelevanan dahulu, kemudian mengikut tarikh sebagai pemutus seri. MongoDB memproses kunci isihan dari kiri ke kanan, jadi letakkan textScore dahulu untuk mengutamakan kerelevanan. Kunci isihan tambahan hanya menentukan susunan antara dokumen yang mempunyai nilai textScore yang sama.
db.articles
.find(
{ $text: { $search: 'mongodb' } },
{ title: 1, createdAt: 1, score: { $meta: 'textScore' } }
)
.sort({
score: { $meta: 'textScore' }, // relevance first
createdAt: -1 // then newest
});Menapis Mengikut Skor Minimum
Jika anda hanya mahu memulangkan dokumen yang sangat relevan, anda boleh menapis mengikut textScore minimum menggunakan ungkapan $meta di dalam peringkat $match (dalam pengagregatan) selepas padanan teks. Hal ini tidak boleh dilakukan dengan penapis find() secara langsung; anda memerlukan saluran paip pengagregatan untuk mengira skor terlebih dahulu dan kemudian menapis berdasarkan skor tersebut.
db.articles.aggregate([
{ $match: { $text: { $search: 'mongodb nosql' } } },
{ $addFields: { score: { $meta: 'textScore' } } },
{ $match: { score: { $gte: 1.5 } } }, // only high-relevance docs
{ $sort: { score: -1 } },
{ $project: { title: 1, score: 1 } }
]);textScore Tidak Menjamin Nilai Mutlak
Nilai textScore adalah relatif dalam set hasil pertanyaan, bukannya nilai mutlak atau nilai yang boleh dibandingkan antara pertanyaan yang berbeza atau keadaan koleksi yang berbeza. Skor 2.5 hari ini mungkin menjadi 3.1 esok jika anda menambahkan lebih banyak dokumen ke dalam koleksi (mengubah pengiraan kekerapan istilah). Gunakan textScore untuk mengisih dalam set hasil, bukan sebagai metrik kualiti yang disimpan.
// Scores vary depending on collection content
// Useful for RANKING within a search result, not for thresholds
// Bad pattern:
const MIN_SCORE = 2.0; // this threshold will drift as data grows
// Better pattern:
// Return the top N results sorted by score
db.articles
.find({ $text: { $search: 'mongodb' } }, { score: { $meta: 'textScore' } })
.sort({ score: { $meta: 'textScore' } })
.limit(10);Penomboran Hasil Carian Teks
Penomboran skip()/limit() standard berfungsi dengan carian teks, tetapi menghadapi isu prestasi biasa pada ofset yang jauh. Oleh sebab hasil disenaraikan mengikut kerelevanan dan bukannya medan yang stabil, penomboran set kunci tidak mudah dilakukan untuk hasil teks. Corak yang lazim ialah menggunakan penomboran berasaskan ofset untuk beberapa halaman pertama (tempat kebanyakan pengguna berhenti) dan mempertimbangkan Atlas Search untuk penomboran yang lebih mendalam dan konsisten pada skala besar.
// Page 1 (skip 0)
db.articles
.find({ $text: { $search: 'mongodb' } }, { score: { $meta: 'textScore' } })
.sort({ score: { $meta: 'textScore' } })
.skip(0).limit(10);
// Page 2 (skip 10) - gets slower on large result sets
db.articles
.find({ $text: { $search: 'mongodb' } }, { score: { $meta: 'textScore' } })
.sort({ score: { $meta: 'textScore' } })
.skip(10).limit(10);textScore dalam Mongoose
Apabila menggunakan Mongoose, anda mengakses textScore melalui pilihan { meta: 'textScore' } pada laluan skema atau dengan menggunakan .select() bersama unjuran metadata score. Mongoose membalut API pemacu MongoDB, jadi konsep asasnya sama—anda hanya perlu mengetahui sintaks Mongoose untuk memproyeksikan dan mengisih berdasarkan metadata.
// Mongoose text search with score projection
const results = await Article.find(
{ $text: { $search: 'mongodb nosql' } },
{ score: { $meta: 'textScore' } } // same $meta syntax
).sort({ score: { $meta: 'textScore' } });
console.log(results.map(r => ({ title: r.title, score: r.score })));Apabila textScore Tidak Mencukupi
Indeks teks asli berfungsi dengan baik untuk kes penggunaan mudah, tetapi tidak mempunyai ciri seperti pelengkapan automatik, carian berfaset, synonyms dan fungsi pemeringkatan tersuai. Apabila anda memerlukan keupayaan ini, MongoDB Atlas Search (yang dibina berasaskan Apache Lucene) menyediakan enjin pemarkahan kerelevanan yang jauh lebih lengkap dengan pemarkahan BM25, peningkatan skor dan output penjelasan untuk melaraskan kerelevanan.
// Atlas Search provides richer scoring with the score option
// db.articles.aggregate([
// { $search: {
// text: { query: 'mongodb', path: 'title', score: { boost: { value: 3 } } },
// } },
// { $addFields: { score: { $meta: 'searchScore' } } },
// { $sort: { score: -1 } }
// ]);
// --> Use Atlas Search when textScore is insufficientSemakan Pantas
Uji pemahaman anda tentang pengisihan mengikut skor teks dengan $meta.
Ulang Kaji Pelajaran
Dalam pelajaran ini, anda telah mempelajari bahawa: textScore ialah skor kerelevanan bagi setiap dokumen yang dikira semasa pertanyaan $text, { $meta: 'textScore' } memproyeksikan dan mengisih berdasarkan skor ini, dan pemberat medan serta kekerapan istilah menentukan magnitud skor. Seterusnya, kita akan membincangkan batasan indeks teks dan masa Atlas Search menjadi pilihan yang lebih baik.
Pelajari JavaScript dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Mengisih Mengikut Skor Teks Dengan $meta” percuma?
Ya — teks penuh “Mengisih Mengikut Skor Teks Dengan $meta” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus MongoDB Academy, tingkat taraf kepada CoddyKit PRO. Kursus MongoDB Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mengisih Mengikut Skor Teks Dengan $meta”?
Pelajar akan mengunjurkan dan mengisih mengikut textScore untuk memaparkan dokumen paling relevan di bahagian atas hasil. Anda berlatih MongoDB Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan MongoDB Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran MongoDB Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Mengisih Mengikut Skor Teks Dengan $meta” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran MongoDB Academy ini?
Ya. Setiap pelajaran MongoDB Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mencipta Indeks Teks pada Medan Rentetan
- Menjalankan Pertanyaan $text Dengan Frasa dan Penafian
- Mengisih Mengikut Skor Teks Dengan $meta
- Had Indeks Teks dan Masa untuk Menggunakan Carian Atlas