Index text și $text în MongoDB & NoSQL

Un index text permite căutarea după cuvinte în câmpuri de text, cu operatorul $text; o colecție poate avea un singur index text.

Sintaxă
db.colectie.createIndex({ <camp>: 'text', ... }, { default_language: 'romanian', weights: { ... } })
db.colectie.find({ $text: { $search: '<cuvinte>' } })

Ce face Index text și $text

Indexul text împarte textul în cuvinte, elimină cuvintele foarte comune (de legătură) și reduce cuvintele la rădăcină, după limba aleasă. MongoDB acceptă și româna: default_language: 'romanian'. Căutarea nu ține cont de majuscule și nici de diacritice (versiunea 3 a indexului).

$text: { $search: 'caiet pix' } găsește documentele cu oricare dintre cuvinte. O expresie între ghilimele caută fraza exactă, iar -cuvant exclude documentele care îl conțin. Pentru ordonarea după relevanță, proiectează și sortează după { $meta: 'textScore' }. Pentru căutare avansată (autocomplete, toleranță la greșeli) există Atlas Search.

Parametri

Parametru Descriere
camp: 'text' Câmpurile incluse în indexul text.
default_language Limba pentru rădăcini și cuvinte ignorate ('romanian', 'english', 'none').
weights Importanța fiecărui câmp, de exemplu { titlu: 10, descriere: 1 }.
$search Cuvintele căutate; "fraza exacta", -exclus.

Ce returnează

createIndex: numele indexului. find cu $text: documentele care conțin termenii.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

use magazin
db.produse.insertMany([
  { _id: 1, titlu: 'Caiet dictando A5', descriere: 'Caiet cu 80 de file' },
  { _id: 2, titlu: 'Pix albastru', descriere: 'Pix cu gel, scriere fină' },
  { _id: 3, titlu: 'Rucsac școlar', descriere: 'Rucsac cu buzunar pentru caiet' }
])

Exemplul 1: Index text pe titlu și descriere

Titlul cântărește mai mult decât descrierea la calculul relevanței.

db.produse.createIndex({ titlu: 'text', descriere: 'text' }, { default_language: 'romanian', weights: { titlu: 10, descriere: 1 } })

Ieșire în mongosh

titlu_text_descriere_text

Exemplul 2: Căutarea unui cuvânt

„caiet” apare în primul produs și în descrierea rucsacului; majusculele nu contează.

db.produse.find({ $text: { $search: 'CAIET' } }, { titlu: 1 }).sort({ _id: 1 })

Ieșire în mongosh

[
  { _id: 1, titlu: 'Caiet dictando A5' },
  { _id: 3, titlu: 'Rucsac școlar' }
]

Exemplul 3: Excluderea unui cuvânt

-rucsac elimină rezultatele care conțin „rucsac”.

db.produse.find({ $text: { $search: 'caiet -rucsac' } }, { titlu: 1 })

Ieșire în mongosh

[ { _id: 1, titlu: 'Caiet dictando A5' } ]

Greșeli frecvente

  • O colecție poate avea un singur index text; dacă vrei mai multe câmpuri, pune-le pe toate în același index.
  • $text găsește cuvinte întregi (după rădăcină), nu bucăți de cuvânt: „cai” nu găsește „caiet”. Pentru prefixe folosește $regex ancorat sau Atlas Search.
  • Fără sortare după textScore (sau alt câmp), ordinea rezultatelor nu este garantată.

Comenzi înrudite

  • $regex: Operatorul $regex caută șiruri de caractere care se potrivesc unei expresii regulate (PCRE), cu opțiuni ca i pentru majuscule.
  • getIndexes(): Listează indexurile unei colecții, cu câmpurile, numele și opțiunile fiecăruia (unique, expireAfterSeconds etc.).
  • Index compus: Un index compus pe mai multe câmpuri accelerează interogările care filtrează și sortează după aceste câmpuri, în ordinea lor.