Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Полнотекстовый поиск (опять), но не могу разобраться / 2 сообщений из 2, страница 1 из 1
09.01.2020, 23:34
    #39912243
Legi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск (опять), но не могу разобраться
Господа, прошу помощи разобраться в основах полнотекстового поиска.

PS: собирал инфу и тут и в доке и даже на хабре

Что дано:

1) Postgres v10
2) текстовый поиск по одной таблице и даже по одному полю (пусть это будет "u_name")
2.1) кол-во записей в таблице сейчас 200к, но будет "контролируемо" расти до нескольких миллионов (я её "наполняю")
2.2) кол-во символов в поле по которому происходит поиск от 10 символов до 300 символов. тип "text"
2.3) значения в этом поле есть как русские так и английские слова (ну и цифры в меньшей степени и не всегда)
2.4) таблица содержит вспомогательные поля типа integer и обогощения с типом text.
3) поиск запихнут в хранимки (plpgsql)

Сначала для поиска я использовал расширение pg_trgm и юзал функцию similarity , но со временем понял что она мне не подходит (к примеру проблема из п. 2.2. приходилось танцы с бубном).

И вот попался мне FTS и слепил вот такой запрос:
Код: plsql
1.
2.
3.
SELECT u_id FROM tbl_unit 
WHERE u_name @@ plainto_tsquery(v_text) AND ts_rank(to_tsvector(u_name), plainto_tsquery(v_text)) > 0 
ORDER BY ts_rank(to_tsvector(u_name), plainto_tsquery(v_text)) DESC



И я понимаю, что это далеко не всё что надо было сделать, или сделал вообще правильно (хоть и работает). Напомню, что поле у меня с типом text

И вот собственно дальше я запутался.

1) Правильно ли я понимаю, что в моём случае, лучше добавить новое поле в таблицу с типом tsvector и каким-то чудным образом заполнить эту полянку? (но каким способом я так и не понял). Или лучше вывести в отдельную таблицу с ключами на основноую и проводить поиск уже по ней и в основную лазить "потом" когда нужно будет обогатить данными (главное найти id-шники)

2) Что необходимо подтюнить (конфиги самого постгреса) для более эффективной работы этого полнотекстового поиска (конкретно именно для работы этой составляющей).

3) Можно как-то сделать (дополнить) словами синонимами не однозначно определяемые из поискового значения. К примеру есть слово "МТС", то это можно найти следующими словами "MTS" или "vnc" или "яйцо" или "красный" и т.д. чтобы руками можно было бы приписать слова синомимы


Рад буду мыслям, идеям, опыту, ссылкам (вдруг будут которые еще не прочитал и там будет всё примитивно расписано).

Спасибо!
...
Рейтинг: 0 / 0
14.01.2020, 09:33
    #39913498
Legi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск (опять), но не могу разобраться
Вдруг кому-то будет полезно:

1. создал отдельную таблицу с нужным мне id и отдельным поле с типом tsvector . Прогнал в цикле по первой таблице, вызвав функцию to_tsvector() и заполнил новую таблицу.
2. Натравил индекс GIN на это поле в таблице.

ИТОГ: скорость поиска повысилась в разы (с 50мс до 0.5мс).

3. руками (для эксперимента) вбил в значение поля tsvector явные синонимы с позициями 1 и теперь у меня "находит" по словам, которых нет в явном виде. т.е. механика отработана.

Пока до конфигов не добрался, думаю вопрос времени или всё же кто-нибудь подскажет :)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Полнотекстовый поиск (опять), но не могу разобраться / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]