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 | Использует минимум памяти и дискового пространства, так как не требует никаких индексов или генерируемых столбцов. |
Может быть выполнено для нескольких столбцов в таблице. | Работает только для одного столбца одновременно. | Может быть выполнено для нескольких столбцов в таблице с использованием фильтров ИЛИ. |
Эффективно работает с большими документами | Эффективно работает с большими документами | Менее производительный при поиске в больших документах |
Добавляет дополнительные затраты памяти и хранилища для сохранения сгенерированного столбца и индекса для каждого поиска. |