Выполните полнотекстовый поиск с помощью 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-запросу.

Выбор языка

По умолчанию полнотекстовый поиск обрабатывает документы на английском языке. Вы можете изменить это с помощью аргумента language в директиве @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 соответствует всем словам, но не обязательно вместе («коричневая собака» будет соответствовать «коричнево-белая собака» или «бело-коричневая собака»).
  • PHRASE соответствует точно заданной фразе («коричневая собака» будет соответствовать «бело-коричневой собаке», но не будет соответствовать «коричнево-белой собаке»).
  • Расширенные настройки позволяют создавать сложные запросы, используя полный набор операторов 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 Использует наименьшее количество памяти и дискового пространства, поскольку не требует индексов или сгенерированных столбцов.
Может выполняться по нескольким столбцам таблицы. Работает только с одним столбцом за раз. Можно выполнить операцию над несколькими столбцами таблицы, используя фильтры ИЛИ.
Более высокая производительность при работе с большими документами. Высокая производительность при работе с большими документами. Менее эффективный поиск при работе с большими документами.
Добавляет накладные расходы на память и хранилище для хранения сгенерированного столбца и индекса для каждого поиска.