Pertimbangkan untuk menggunakan indeks teks
dengan $text
cari
. Ini mungkin solusi yang jauh lebih baik daripada menggunakan ekspresi reguler. Namun, pencarian teks mengembalikan dokumen berdasarkan algoritma penilaian, sehingga Anda mungkin mendapatkan beberapa hasil yang tidak memiliki semua kata kunci yang Anda cari.
Jika Anda tidak dapat atau tidak ingin menambahkan indeks teks ke bidang ini, menggunakan ekspresi reguler tunggal akan sangat merepotkan karena Anda tidak tahu urutan kemunculan kata-kata ini. Saya tidak mengklaim tidak mungkin untuk menulis, tetapi Anda akan berakhir dengan kekejian yang mengerikan bahkan untuk standar regex. Akan jauh lebih mudah untuk menggunakan operator regex beberapa kali dengan menggunakan $and
operator.
Juga, menggunakan spasi sebagai pembatas akan gagal ketika kata berada di awal atau akhir string atau diikuti oleh titik atau koma. Gunakan token batas kata (\b
) sebagai gantinya.
collection.find(
{ $and : [
{'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
]
});
Ingatlah bahwa ini adalah kueri yang sangat lambat, karena akan menjalankan tiga ekspresi reguler ini pada setiap dokumen koleksi. Jika ini adalah kueri yang kritis terhadap kinerja, pertimbangkan dengan serius apakah indeks teks benar-benar tidak berfungsi. Jika gagal, hal terakhir yang harus dipahami adalah mengekstrak kata kunci apa pun dari documenttextfield
bidang yang dapat ditelusuri seseorang (yang mungkin berupa setiap kata unik di dalamnya) ke dalam bidang larik baru documenttextfield_keywords
, buat indeks normal di bidang itu, dan cari di bidang itu dengan $all
operator
(tidak diperlukan ekspresi reguler dalam kasus itu).