Требование: убедитесь, что текстовый поиск одного символа ci в составных столбцах обрабатывается наиболее эффективным и производительным способом, включая сортировку веса релевантности;
Наличие таблицы create table test_search (id int primary key, full_name varchar(300) not null, short_name varchar(30) not null);
с 3 млн строк API-вызов подсказки отправляет запросы в базу данных, начиная с первого введенного символа и первых 20 символов. должны быть возвращены результаты, упорядоченные по релевантности.
Опции/недостатки:
like lower()
/ilike
больше'%c%'
: медленно работает с большими наборами данных, не релевантно;- pg_trgm с поиском на основе триграмм
like/ilike
+ составной индексgin/gist
: один символ не может быть разбит на несколько триграмм, поэтому поиск выполняется через полное сканирование таблицы, без релевантности; - полнотекстовый поиск по индексу
setweight(to_tsvector(lower()))
gin/gist
: вывод на основе релевантности, но меньше результатов из-за токенов, исключающих отдельные символы;
Существуют ли другие варианты улучшения поиска по одному символу? Как улучшить или смешать упомянутое выше, чтобы получить наилучший результат? Как заставить полный текст пропустить стоп-лист и создать все возможные лексемы, такие как it возможно для sqlserver?