Przeprowadzanie wyszukiwania pełnotekstowego za pomocą funkcji Data Connect

Firebase Data Connect obsługuje wyszukiwanie pełnotekstowe oparte na PostgreSQL. Wyszukiwanie pełnotekstowe umożliwia szybkie i skuteczne znajdowanie informacji w dużych zbiorach danych przez wyszukiwanie słów kluczowych i frazeologizmów w wielu kolumnach jednocześnie.

Możesz dodać do usługi wyszukiwanie pełnotekstowe. Najpierw dodaj dyrektywę @searchabledo String w schemacie, w którym chcesz wyszukiwać. Przykład:

type Movie
  @table {

  # The fields you want to search over
  title: String! @searchable
  genre: String @searchable
  description: String @searchable
  tags: [String]

  # Some other fields that we won't search over
  rating: Float
  imageUrl: String!
  releaseYear: Int
}

Po dodaniu tej dyrektywy możesz przeprowadzić wyszukiwanie pełnotekstowe, dodając do zapytania pole <pluralType>_search. W tym przypadku będzie to:movies_search

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
  }
}

Dostrajanie wyników wyszukiwania pełnotekstowego

Możesz dostosować wyniki wyszukiwania pełnotekstowego, dodając argumenty do dyrektywy @searchable i pola _search.

Wspólne argumenty

Wyniki wyszukiwania możesz kontrolować za pomocą wielu argumentów używanych w przypadku podstawowych pól listy<pluralType>:

  • order umożliwia zmianę kolejności wyników. Jeśli ten parametr zostanie pominięty, wyniki będą sortowane według trafności w kolejności malejącej.
  • where umożliwia dodawanie dodatkowych filtrów wyszukiwania (np. wyszukiwanie tylko filmów określonego gatunku).
  • limit powoduje, że zapytanie zwraca tylko X najlepszych wyników.
  • offset powoduje pominięcie pierwszych X wyników.
  • distinct dodaje do wygenerowanego kodu SQL operator DISTINCT.

Wybór języka

Domyślnie wyszukiwanie pełnotekstowe analizuje dokumenty w języku angielskim. Możesz to zmienić za pomocą argumentu language w dyrektywie @searchable:

type Movie
  @table {
  title: String! @searchable(language: "french")
  ...
}

Określenie właściwego języka umożliwi PostgreSQL dokładne leksykalne wyodrębnianie rdzeni słów i pomoże zapewnić, że wyszukiwanie nie pominie trafnych wyników. Jeśli wyszukiwanie obejmuje wiele kolumn, wszystkie muszą być ustawione na ten sam język.

Języki
  • proste,
  • arabski
  • ormiański
  • baskijski
  • kataloński
  • duński
  • niderlandzki
  • english
  • fiński
  • francuski
  • niemiecki,
  • grecki
  • hindi
  • węgierski
  • indonezyjski
  • irlandzki
  • włoski
  • litewski,
  • nepalski,
  • norweski

Korzystając z psql, możesz uzyskać pełną listę za pomocą tego zapytania:

SELECT cfgname FROM pg_ts_config;

Format zapytania

Domyślnie wyszukiwanie pełnotekstowe używa semantyki internetowej w przypadku zapytań (podobnie jak wyszukiwarka Google). Możesz zmienić to zachowanie za pomocą argumentu queryFormat w polu <pluralType>_search.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, queryFormat: PHRASE) {
    ...
  }
}

Dostępne są 4 opcje formatu zapytania:

  • QUERY zapewnia wyszukiwarkom internetowym znaną semantykę (np. ciągi znaków w cudzysłowie, operatory AND i OR). Jest to ustawienie domyślne.
  • PLAIN pasuje do wszystkich słów, ale niekoniecznie razem („brązowy pies” będzie pasować do „brązowo-białego psa” lub „biało-brązowego psa”).
  • WYRAŻENIE dopasowuje dokładnie wyrażenie („brązowy pies” będzie pasować do „biało-brązowego psa”, ale nie do „brązowo-białego psa”).
  • ZAAWANSOWANE umożliwia tworzenie złożonych zapytań za pomocą pełnego zestawu operatorów tsquery.

Próg trafności

Ustawienie progu trafności oznacza, że wyszukiwanie będzie zwracać tylko wyniki o wartości trafności powyżej określonego progu. W wielu przypadkach nie musisz tego ustawiać – każdy wynik o trafności większej niż 0 będzie trafny.

Jeśli jednak wyniki wyszukiwania nie są dla Ciebie odpowiednie, możesz je odfiltrować za pomocą progu trafności.

Aby określić odpowiednią wartość progu trafności, przeprowadź kilka wyszukiwań testowych i sprawdź _metadata.relevance:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    _metadata {
      relevance
    }
    ...
  }
}

Wybierz próg, który pomija wyniki, które uważasz za nieistotne. Aby to zrobić:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, relevanceThreshold: 0.05) {
    id
    title
    ...
  }
}

Wybieranie między wyszukiwaniem pełnotekstowym, wyszukiwaniem podobieństwa wektorowego a filtrami wzorców ciągów tekstowych

Data Connect oferuje kilka różnych sposobów przeszukiwania bazy danych.

Skorzystaj z tej tabeli, aby wybrać odpowiedni typ w swoim przypadku użycia.

Wyszukiwanie pełnotekstowe Wyszukiwanie podobieństwa wektorowego Filtry wzorców ciągów znaków
Dobrze sprawdza się w przypadku implementowania ogólnej funkcji wyszukiwania. Przydatne do znajdowania wierszy podobnych semantycznie (np. rekomendacji lub „Więcej podobnych”) Dobre w przypadku dokładnych dopasowań tekstu lub wyszukiwania opartego na wyrażeniach regularnych
Przeprowadza leksykalne obcinanie wyrazów, które pomaga dopasowywać różne formy lub czasy tego samego słowa. Wymaga Vertex AI Zużywa najmniej pamięci i miejsca na dysku, ponieważ nie wymaga indeksów ani wygenerowanych kolumn.
Można je wykonywać w wielu kolumnach tabeli. Działa tylko w przypadku jednej kolumny naraz Można go zastosować do wielu kolumn w tabeli za pomocą filtrów OR.
Wydajność w przypadku większych dokumentów Wydajne w przypadku dużych dokumentów Mniejsza wydajność podczas wyszukiwania w większych dokumentach
Zwiększa obciążenie pamięci i miejsca na dane, ponieważ trzeba przechowywać wygenerowaną kolumnę i indeks dla każdego wyszukiwania.