Предположим, у меня есть таблица с несколькими столбцами. Например:
id int
name text
surname text
cars json
пример записи будет
+----+------+---------+------------------------------------+
| id | name | surname | cars |
+----+------+---------+------------------------------------+
| 1 | John | Doe | {"values":["Ford", "BMW", "Fiat"]} |
+----+------+---------+------------------------------------+
Я хочу выполнить поиск по всем этим данным таблицы на предмет релевантности следующим образом:
select *,
similarity(
'Malcolm Joe likes Ferrary, but hates BMW',
(name || (cars ->> 'values') || surname)
) sim
from public.test_table
where similarity(
'Malcolm Joe likes Ferrary, but hates BMW',
(name || (cars ->> 'values') || surname)
) > 0.05
order by sim desc;
Есть ли способ ускорить этот поиск? Создание триграммного индекса? Если да - как лучше создать? в одном столбце, в каждом столбце, в выражении конкатенации? Также я не понял, какой тип индекса лучше - GIN или GiST. Я читал, что GIN обычно лучше для обычного полнотекстового поиска, но GiST лучше для поиска по триграмме. Это верно?
Я также хотел спросить, есть ли лучший способ написать вышеуказанный запрос?
Если кому-то интересно, почему я выбрал триграмму, а не обычный полнотекстовый поиск - это потому, что строки поиска будут поступать от обработки некоторого пользовательского ввода, поэтому могут быть ошибки или даже случаи, когда английские 'o' или 'c' заменяются кириллическими буквами. мои записи в базе данных или поиск также могут содержать буквенно-цифровые данные, которые также лучше обрабатываются с помощью триграммы.