W tym rozdziale przedstawimy pełnotekstowe wyszukiwanie w MongoDB, które różni się od operatora "like" w SQL. Pełnotekstowe wyszukiwanie w MongoDB jest bardziej wydajne w wyszukiwaniu tekstu w porównaniu z implementacją "like" w SQL.

Przygotowanie danych testowych

Wstaw kilka rekordów do kolekcji sklepów

db.stores.insert(
   [
     { _id: 1, name: "Java Hut", description: "Kawa i ciasta" },
     { _id: 2, name: "Burger Buns", description: "Hamburgery gourmet" },
     { _id: 3, name: "Coffee Shop", description: "Tylko kawa" },
     { _id: 4, name: "Clothes Clothes Clothes", description: "Ubrania w obniżonych cenach" },
     { _id: 5, name: "Java Shopping", description: "Towary indonezyjskie" }
   ]
)

Utwórz indeks pełnotekstowy

Aby skorzystać z możliwości pełnotekstowego wyszukiwania, musisz utworzyć indeks tekstowy. Przykład:

db.stores.createIndex( { name: "text", description: "text" } )

Wyjaśnienie:

  • Tworzenie indeksu tekstowego dla pól name i description.

Uwaga: Kolekcja pozwala tylko na jeden indeks tekstowy, ale indeks tekstowy może zawierać wiele pól.

Operator $text

Użyj operatora $text do wyszukiwania tekstu.

Składnia:

{ $text: { $search: "słowo kluczowe" } }

Przykład:

db.stores.find( { $text: { $search: "java kawiarnia" } } )

Wyjaśnienie:

  • Wyszukaj dokumenty zawierające słowa kluczowe "kawa", "kawiarnia" i "java" w polach name i description.

Wynik:

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Tylko kawa" }
{ "_id" : 1, "name" : "Java Hut", "description" : "Kawa i ciasta" }
{ "_id" : 5, "name" : "Java Shopping", "description" : "Towary indonezyjskie" }

Wyszukiwanie frazowe

db.stores.find( { $text: { $search: "\"kawiarnia kawa\"" } } )

Wynik

{ "_id" : 3, "name" : "Coffee Shop", "description" : "Tylko kawa" }

Sortowanie według istotności

Domyślnie wyniki zapytania $text są niesortowane. Zapytanie $text oblicza wynik (textScore) dla istotności każdego dokumentu. Możemy użyć tego wyniku do sortowania i wyświetlania dokumentów o wyższej istotności na górze.

db.stores.find(
   { $text: { $search: "java kawiarnia" } },
   { score: { $meta: "textScore" } }  // Deklaracja zwrócenia wyniku textScore dla istotności
).sort( { score: { $meta: "textScore" } } ) // Określenie sortowania za pomocą textScore

Uwaga: Pełnotekstowe wyszukiwanie w MongoDB nie zapewnia bardzo dobrego wsparcia dla chińskich fraz.