Wyszukiwanie tekstowe

Aby wyszukiwać określone ciągi znaków w kolekcji, użyj funkcji wyszukiwania tekstowego w Cloud Firestore.

Zanim zaczniesz

Zanim zaczniesz korzystać z wyszukiwania tekstowego, wykonaj te czynności:

  1. Sprawdź, czy masz dostęp do istniecej 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.

Wyszukiwanie tekstowe używa operatora $text w filtrze. Określany ciąg znaków podaj w argumencie $search.

Aby przeprowadzić ogólne wyszukiwanie tekstowe, 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, możesz filtrować według partycji, uwzględniając ją w filtrze równości „and” w wyszukiwaniu. Jeśli na przykład masz partycję city, możesz filtrować wyszukiwanie tekstowe w ten sposób:

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

Możesz też filtrować agregację według 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 sekwencję słów ujętą 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 tekstowe było dokładniejsze, określ ciąg haseł. Na przykład, to wyszukiwanie zwraca dokumenty pasujące 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, dodaj przed nim łącznik (-):

  # 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

Aby obliczyć wynik trafności dokumentów pasujących do wyszukiwania tekstowego, użyj wyrażenia {$meta: "textScore"} do obliczenia wyniku trafności dokumentów pasujących do wyszukiwania tekstowego. Aby posortować wyniki w kolejności malejącej według wyniku, użyj $meta w wyrażeniu sortowania. 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żyć 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"} } },
  ]);

Aby zwiększyć trafność wyników wyszukiwania tekstowego, 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 odmienionych, haseł z poprawioną pisownią, wariantów diakrytycznych i innych.

Ograniczenia

  • W tym samym wyszukiwaniu tekstowym nie można używać operatorów $near i $text.
  • W przypadku wyszukiwania find lub aggregation dozwolony jest tylko 1 operator $text.
  • W przypadku agregacji etap $match z $text musi być pierwszym etapem potoku.
  • Operator $text może być zagnieżdżony tylko w $and i $or.
  • Jeśli $text znajduje się w $or, niepowiązane z wyszukiwaniem rozłączne mogą używać istniejących indeksów uporządkowanych, aby zoptymalizować wyszukiwanie. Jeśli inne rozłączne nie są indeksowane, wyszukiwanie opiera się na skanowaniu kolekcji.
  • Operatora $text nie można używać ze wskazówkami.
  • W przypadku zapytań z wyszukiwaniem tekstowym nie można sortować według $natural.