Я хочу найти 2 символа, есть ли решение? (индекс триграммы работает только для минимум 3 символов) - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть индекс триграммы в столбцах имени и фамилии, и я хочу найти 2 символа. Я попытался выполнить запрос с включенным или выключенным последовательным сканированием и измерить, сколько времени это занимает в каждом случае, но в обоих случаях это занимает много времени. Есть ли решение для моего поиска в 2 символа, чтобы он работал быстрее?

В схеме у меня есть:

t.index "((((first_name) :: text || '' :: text) || (last_name) :: text)) gin_trgm_ops ", имя:" index_users_full_name ", используя:: gin

1 Ответ

0 голосов
/ 03 февраля 2020

Не думаю, что для этого есть что-то встроенное. Вы можете создать функцию, которая превращает текст в массив биграмм (решая, что делать с пробелами, пунктуацией, не-ASCII и т. Д. c.), А затем индексировать этот массив и выполнять запрос с помощью оператора &&. Но если ваши два символа не похожи на 'qz', вы можете не получить достаточной избирательности, чтобы сделать индекс полезным.

create function bigram(text) returns text[] language sql as $$
    select array_agg(substring($1,x,2)) from generate_series(1,length($1)-1) f(x);
$$ immutable;

create index on foobar using gin (bigram(t));
select * from foobar where bigram(t) && bigram('aa');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...