Comments 12
Или что-то все же можно придумать для быстрого поиска?
Рассматривали ли вариант использования Elasticsearch?
Отличная статья, спасибо!
Что если канонизировать текст перед постройкой индексов?
Имеется в виду привести все к единой форме: в именительный падеж, инфинитив и т.д. И вынести слова в отдельную таблицу, в связующей таблице хранить id слова и id текста, в котором оно встречается.
Соответственно и строку поиска нужно канонизировать.
Конечно, это потребует средства NLP и, скорее всего, подготовку текстов нужно реализовывать за пределами постгреса, но это будет нести определенные выгоды при поиске, а так же, по идее, должно потреблять меньше места и быть сопоставимо по производительности
В статье в индексах и в самом запросе используют to_tsvector, он и приводит все в инфинитив, именительный падеж и окончания откидывает. В статье используют словарь 'simple', в postgres должны быть словари для разных языков.
Имеется в виду привести все к единой форме: в именительный падеж, инфинитив и т.д. И вынести слова в отдельную таблицу, в связующей таблице хранить id слова и id текста, в котором оно встречается.Собственно, это ровно то, что происходит «внутри» gist-индекса по to_tsvector('russian', str).
Подробнее можно почитать про конфигурации текстового поиска.
Спасибо за статью, решение интересное и 2мс впечатляет
Возможно оффтопик, мне очень интересно как живется когда все переменные в одну-две буквы, проходит ли такое ревью, можно ли привыкнуть с таким кодом работать? Имею в виду p[0] >= ps[0], src.ps <-> kw.p, dc, T(kw, dt) и тп.
Ещё интересно что побуждает, знаю что математики используют такое именование, или автор печатает медленно и лишняя буква — лишнее время.
Возможно оффтопик, мне очень интересно как живется когда все переменные в одну-две буквы, проходит ли такое ревью, можно ли привыкнуть с таким кодом работать? Имею в виду p[0] >= ps[0], src.ps <-> kw.p, dc, T(kw, dt) и тп.
Ещё интересно что побуждает, знаю что математики используют такое именование, или автор печатает медленно и лишняя буква — лишнее время.
как живется когда все переменные в одну-две буквы, проходит ли такое ревью, можно ли привыкнуть с таким кодом работать?Как известно, «на вкус и цвет». Если использовать вполне стандартные сокращения типа dt — date, kw — keyword, T — для принудительного алиаса внутри FROM, то эффективность чтения таких запросов не страдает нисколько, зато гораздо меньше шансов наступить на reserved keywords.
github.com/postgrespro/rum попробуйте. Вот мой доклад про него
www.sai.msu.su/~megera/postgres/talks/pgopen-2016-rum.pdf
www.sai.msu.su/~megera/postgres/talks/pgopen-2016-rum.pdf
Кстати, да, спасибо за напоминание про него — забываю все время, поскольку требует сборки-установки, что резко ограничивает область использования. Готовых бинарников случайно нету?
Было бы идеально его в стандартные дистрибутивы дотащить по модели btree_gist — сделал просто
Было бы идеально его в стандартные дистрибутивы дотащить по модели btree_gist — сделал просто
CREATE EXTENSION
— и счастье.Мы сами не поддерживаем, но сообщество собирает
apt.postgresql.org/pub/repos/apt/pool/main/p/postgresql-rum
Я думаю про то, чтобы RUM сделать GIN-ом в сообществе.
apt.postgresql.org/pub/repos/apt/pool/main/p/postgresql-rum
Я думаю про то, чтобы RUM сделать GIN-ом в сообществе.
Sign up to leave a comment.
SQL HowTo: префиксный FTS-поиск с релевантностью по дате