Korzystaj z funkcji wyszukiwania tekstu w Cloud Firestore, aby wyszukiwać określone ciągi znaków w kolekcji.
Zanim zaczniesz
Zanim zaczniesz korzystać z zapytań tekstowych, 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ą.
Sprawdź, czy masz indeks tekstowy, lub utwórz indeks tekstowy.
Uprawnienia
Aby utworzyć indeks w Cloud Firestore, musisz mieć jedną z tych ról:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Informacje o przyznawaniu ról znajdziesz w artykule Przyznawanie pojedynczej roli. Więcej informacji o rolach Cloud Firestore i powiązanych z nimi uprawnieniach znajdziesz w artykule Wstępnie zdefiniowane role.
Jeśli masz zdefiniowane role niestandardowe, przypisz wszystkie te uprawnienia, aby utworzyć indeksy:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Uruchamianie zapytania tekstowego
Zapytania tekstowe używają operatora $text w filtrze.
Określ ciąg znaków, którego dotyczy zapytanie, w argumencie $search.
Uruchamianie ogólnego zapytania tekstowego
Aby wykonać ogólne zapytanie, uruchom to zapytanie:
# Find query
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
Jeśli indeks jest podzielony na partycje, możesz filtrować na podstawie partycji, uwzględniając ją w zapytaniu w filtrze równości „and”.
Jeśli na przykład masz partycję city, możesz odfiltrować zapytanie tekstowe 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 zapytaniem za pomocą operatora „and”.
Ustawianie języka zapytań
Język zapytania możesz ustawić za pomocą argumentu $language. Przykład:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
Jeśli nie ustawisz języka zapytania, zostanie użyty język indeksu tekstu.
Wyszukiwanie dokładnego hasła
Aby wyszukać dokładne słowo, skonfiguruj je jako ciąg słów ujęty w cudzysłów. Przykład:
# Find query
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
Wyszukiwanie kombinacji haseł
Aby sprecyzować zapytanie, podaj ciąg terminów. Na przykład to zapytanie zwraca dokumenty pasujące do kombinacji best AND french AND ("bread" OR "is"):
# Find query
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
Wykluczanie hasła
Aby wykluczyć termin z zapytania, dodaj przed nim myślnik (-):
# Find query
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation query
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 pasujących do zapytania tekstowego. Aby posortować wyniki w kolejności malejącej według wyniku, użyj w wyrażeniu sortowania symbolu $meta. Oto przykłady, w których SCORE_FIELD to nazwa pola używanego do przechowywania wartości wyniku:
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
W wyrażeniach projekcji możesz też używać wyniku tekstowego. Przykład:
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
Rozwiń zapytanie
Aby zwiększyć trafność wyników zapytania, operator $text rozszerza wyszukiwany ciąg znaków zgodnie z określonym językiem, aby uwzględnić dopasowania do synonimów uwzględniających kontekst, form podstawowych, terminów z poprawioną pisownią, odmian z diakrytykami i innych.
Ograniczenia
- Operatorów
$neari$textnie można używać w tym samym zapytaniu. - W przypadku zapytania
findlubaggregationdozwolony jest tylko 1 operator$text. - W agregacjach etap
$matchz funkcją$textmusi być pierwszym etapem potoku. - Element
$textmoże być zagnieżdżony tylko w elementach$andi$or. - Jeśli
$textznajduje się w$or, niepowiązane z wyszukiwaniem części alternatywne mogą używać istniejących indeksów uporządkowanych do optymalizacji zapytania. Jeśli pozostałe składniki alternatywy nie są indeksowane, zapytanie będzie opierać się na skanowaniu kolekcji. - Nie można używać funkcji
$textze wskazówkami dotyczącymi zapytań. - W przypadku zapytań z wyszukiwaniem tekstowym nie można sortować wyników według
$natural.