Лучший индекс для использования при полнотекстовом поиске PostgreSQL с взвешенным цветом - PullRequest
1 голос
/ 13 февраля 2020

Я новичок в базах данных, и у меня нет четкого представления о том, как работает индексация.

Я смотрю на индексирование столбца в моем, который содержит взвешенный tsvector (title дается наибольший вес, затем следует подзаголовок, а затем содержание абзаца). Согласно документации Postgres, GIN является лучшим для полнотекстового поиска, за которым следует GiST. Однако в главе 12.9 есть примечание:

Индексы GIN являются предпочтительным типом индекса текстового поиска. Как инвертированные индексы, они содержат запись индекса для каждого слова (лексемы) со сжатым списком соответствующих местоположений. Поиск по нескольким словам может найти первое совпадение, а затем использовать индекс для удаления строк, в которых отсутствуют дополнительные слова. Индексы GIN хранят только слова (лексемы) значений tsvector, а не их весовые метки. Таким образом, повторная проверка строки таблицы необходима при использовании запроса с весами.

Означает ли это, что GIN неэффективен в моем случае использования, и я должен go с GiST, или это все еще лучший один использовать? Я использую последнюю версию Postgres (12).

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Реализация индексов GiST для tsvector с потерями, поэтому им также необходимо обратиться к таблице. Эта часть документации странная, так как кажется, что она сравнивает GIN с GiST, но ни GIN, ни GiST не хранят веса, поэтому нечего противопоставлять. (GiST даже не хранит значения намного меньше весов, только хэшированный бит значения).

Кроме того, веса используются только при ранжировании, а не при поиске.

О Единственный раз, когда GiST будет предпочтительнее для tsvector, это если вы хотите многостолбцовый индекс, где вы будете использовать И выборочные критерии для разных столбцов.

1 голос
/ 13 февраля 2020

Нет, вам следует придерживаться индексов GIN.

Сканирование индекса действует как фильтр и, как мы надеемся, удаляет большинство строк, так что только немногие должны быть перепроверены.

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

Лучше всего будет выполнить некоторые тесты для ваших данных установите, что даст вам авторитетный ответ, какой индекс лучше в вашем случае.

Чтобы узнать, сколько ложных срабатываний было удалено во время сканирования кучи растрового изображения, вы можете проверить вывод EXPLAIN (ANALYZE, BUFFERS) для запроса .

...