Wyszukiwanie tekstowe

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:

  1. 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ą.

  2. 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.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/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.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.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 $near$text nie można używać w tym samym zapytaniu.
  • W przypadku zapytania find lub aggregation dozwolony jest tylko 1 operator $text.
  • W agregacjach etap $match z funkcją $text musi być pierwszym etapem potoku.
  • Element $text może być zagnieżdżony tylko w elementach $and$or.
  • Jeśli $text znajduje 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 $text ze wskazówkami dotyczącymi zapytań.
  • W przypadku zapytań z wyszukiwaniem tekstowym nie można sortować wyników według $natural.