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.