Выполните полнотекстовый поиск с помощью Data Connect

Firebase Data Connect поддерживает полнотекстовый поиск на базе PostgreSQL. Полнотекстовый поиск позволяет быстро и эффективно находить информацию в больших наборах данных, выполняя поиск по ключевым словам и фразам сразу по нескольким столбцам.

Вы можете добавить полнотекстовый поиск в свой сервис. Сначала добавьте директиву @searchable к String в схеме, по которой вы хотите выполнить поиск. Например:

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
}

После добавления этой директивы вы сможете выполнять полнотекстовый поиск, добавив поле <pluralType>_search в запрос. В данном случае это будет movies_search :

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

Тонкая настройка результатов полнотекстового поиска

Вы можете точно настроить результаты полнотекстового поиска, добавив аргументы в директиву @searchable и поле _search ;

Общие аргументы

Вы можете управлять результатами поиска, используя многие из тех же аргументов, которые используются для основных полей списка <pluralType> :

  • order позволяет изменить порядок результатов. Если он не указан, результаты будут отсортированы по убыванию релевантности.
  • where позволяет добавлять дополнительные фильтры для поиска (например, искать только фильмы определенного жанра).
  • limit заставляет запрос возвращать только первые X результатов.
  • offset заставляет запрос пропускать первые X результатов.
  • distinct добавляет оператор DISTINCT к сгенерированному SQL.

Выбор языка

По умолчанию полнотекстовый поиск обрабатывает документы на английском языке. Вы можете изменить это с помощью аргумента языка в директиве @searchable :

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

Указание правильного языка позволит PostgreSQL выполнить точный лексический стемминг и гарантировать, что ваш поиск не пропустит релевантные результаты. При поиске по нескольким столбцам необходимо задать для всех них один и тот же язык.

Языки
  • простой
  • арабский
  • армянский
  • баскский
  • каталонский
  • датский
  • голландский
  • английский
  • финский
  • французский
  • немецкий
  • греческий
  • хинди
  • венгерский
  • индонезийский
  • ирландский
  • итальянский
  • литовский
  • непальский
  • норвежский

Используя psql , вы можете получить полный список с помощью следующего запроса.

SELECT cfgname FROM pg_ts_config;

Формат запроса

По умолчанию полнотекстовый поиск использует веб-семантику для запросов (аналогично поиску Google). Вы можете изменить это поведение с помощью аргумента queryFormat в поле <pluralType>_search .

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

Существует четыре варианта формата запроса:

  • QUERY реализует привычную для поисковых систем семантику (например, строки в кавычках, AND и OR). Этот параметр используется по умолчанию.
  • PLAIN соответствует всем словам, но не обязательно вместе («brown dog» будет соответствовать «the brown and white dog» или «the white and brown dog»).
  • ФРАЗА соответствует точной фразе («коричневая собака» будет соответствовать «бело-коричневая собака», но не будет соответствовать «коричнево-белая собака»).
  • ADVANCED позволяет создавать сложные запросы с использованием полного набора операторов tsquery .

Порог релевантности

Установка порога релевантности означает, что ваш поиск будет возвращать только результаты, превышающие определённое значение релевантности. Во многих случаях вам не нужно устанавливать этот порог — любой результат с релевантностью больше 0 будет считаться релевантным.

Однако если вы обнаружите, что результаты вашего поиска не кажутся релевантными, порог релевантности может отфильтровать их.

Чтобы определить подходящее значение порога релевантности, следует выполнить несколько тестовых поисков и просмотреть _metadata.relevance :

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

Выберите пороговое значение, которое исключит результаты, которые вы считаете нерелевантными. Для этого:

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

Выбор между полнотекстовым поиском, поиском по сходству векторов и фильтрами строковых шаблонов

Data Connect предлагает несколько различных способов поиска по вашей базе данных.

Используйте эту таблицу, чтобы выбрать правильный вариант для вашего варианта использования.

Полнотекстовый поиск Поиск сходства векторов Фильтры строковых шаблонов
Подходит для реализации общей функции поиска. Подходит для поиска семантически схожих строк (например, рекомендаций или «Похожих тем»). Подходит для точного совпадения текста или поиска по регулярным выражениям.
Выполняет лексический стемминг, который помогает сопоставлять разные формы или времена одного и того же слова. Требуется Vertex AI Использует минимум памяти и дискового пространства, так как не требует никаких индексов или генерируемых столбцов.
Может быть выполнено для нескольких столбцов в таблице. Работает только для одного столбца одновременно. Может быть выполнено для нескольких столбцов в таблице с использованием фильтров ИЛИ.
Эффективно работает с большими документами Эффективно работает с большими документами Менее производительный при поиске в больших документах
Добавляет дополнительные затраты памяти и хранилища для сохранения сгенерированного столбца и индекса для каждого поиска.