Aby wyszukać konkretne ciągi znaków w kolekcji, użyj funkcji wyszukiwania tekstu w Cloud Firestore.
Zanim zaczniesz
Zanim zaczniesz korzystać z wyszukiwania tekstowego, wykonaj te czynności:
Upewnij się, że masz dostęp do istniejącej bazy danych operacji zgodnej z MongoDB, lub utwórz bazę danych i połącz się z nią.
Upewnij się, że masz indeks tekstowy, lub utwórz go.
Przeprowadzanie wyszukiwania tekstowego
Wyszukiwanie tekstu używa operatora $text w filtrze.
Określ ciąg zapytania w argumencie $search.
Przeprowadzanie ogólnego wyszukiwania tekstowego
Aby przeprowadzić ogólne wyszukiwanie tekstu, uruchom to polecenie:
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
Jeśli indeks jest podzielony na partycje, możesz filtrować według partycji, uwzględniając partycję w filtrze równości „and” w wyszukiwaniu.
Jeśli na przykład masz partycję city, możesz filtrować wyszukiwanie tekstu w ten sposób:
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
Możesz też filtrować agregację na podstawie partycji. Przykład:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
Wartość partycji musi być ciągiem znaków. Filtr partycji musi być połączony z wyszukiwaniem tekstowym za pomocą operatora „and”.
Ustawianie języka wyszukiwania tekstowego
Język wyszukiwania tekstowego możesz ustawić za pomocą argumentu $language. Przykład:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
Jeśli nie ustawisz języka, wyszukiwanie będzie używać języka indeksu tekstowego.
Wyszukiwanie dokładnego hasła
Aby wyszukać dokładne hasło, skonfiguruj je jako ciąg słów ujętych w cudzysłów. Przykład:
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
Wyszukiwanie kombinacji haseł
Aby wyszukiwanie tekstu było bardziej precyzyjne, określ ciąg haseł. Na przykład to wyszukiwanie zwraca dokumenty, które pasują do kombinacji best AND french AND ("bread" OR "is"):
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
Wykluczanie hasła
Aby wykluczyć hasło z wyszukiwania tekstowego, poprzedź je łącznikiem (-):
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
Obliczanie wyniku trafności
Użyj wyrażenia {$meta: "textScore"}, aby obliczyć wynik trafności dokumentów dopasowanych przez wyszukiwanie tekstowe. Aby posortować wyniki w kolejności malejącej, użyj w wyrażeniu sortowania $meta. Rozważ te przykłady, w których SCORE_FIELD to nazwa pola używanego do przechowywania wartości wyniku:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
Możesz też używać wyniku tekstowego w wyrażeniach projekcji. Przykład:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
Rozwiń wyszukiwanie
Aby zwiększyć trafność wyników wyszukiwania tekstu, operator $text rozszerza wyszukiwany ciąg znaków zgodnie z określonym językiem, aby uwzględnić dopasowania synonimów zależnych od kontekstu, form podstawowych, haseł z poprawioną pisownią, odmian znaków diakrytycznych i innych.
Ograniczenia
- W tym samym wyszukiwaniu tekstowym nie można używać operatorów
$neari$text. - W wyszukiwaniu
findlubaggregationdozwolony jest tylko 1 operator$text. - W agregacjach etap
$matchz$textmusi być pierwszym etapem potoku. - Element
$textmoże być zagnieżdżony tylko w elementach$andi$or. - Jeśli
$textznajduje się wewnątrz$or, alternatywy niewyszukiwane mogą używać istniejących uporządkowanych indeksów do optymalizacji wyszukiwania. Jeśli inne alternatywy nie są indeksowane, wyszukiwanie opiera się na skanowaniu kolekcji. - Nie można używać
$textze wskazówkami. - Zapytań z wyszukiwaniem tekstowym nie można sortować według:
$natural.