Почему полнотекстовый поиск в таблице с индексом GIN все еще очень медленный - PullRequest
0 голосов
/ 19 октября 2018

С тем, что я смог собрать до сих пор, если вам нужно запустить полнотекстовый поиск по таблице в базе данных PostgreSQL с большим количеством записей (скажем, порядка 1.2M +), рекомендуется создатьиндекс для этой таблицы (в данном случае мы создали индекс GIN), который должен позволить вам выполнить запрос, подобный следующему:

SELECT * FROM speech WHERE speech_tsv @@ plainto_tsquery('a text string')

В дополнение к результатам этого запроса иногда не содержится ничего связанногоСтрока поиска часто занимает от 8 до 10 секунд.

БД развернута на довольно крупном многоядерном экземпляре EC2, поэтому я думаю, возможно ли что-то еще, что мы могли бы сделать с БД, чтобы эти запросы выполнялись быстрее?

Или это время выполнения запроса о разумных, учитывая огромное количество файлов и текста, которые мы просим его просмотреть (даже с помощью индексации)?

Вот как выглядит таблица:

                                     Table "public.speech"
    Column     |            Type             |                      Modifiers                      
---------------+-----------------------------+-----------------------------------------------------
 speech_id     | integer                     | not null default nextval('speech_id_seq'::regclass)
 speechtype_id | smallint                    | not null
 title         | character varying           | not null default ''::character varying
 speechdate    | date                        | default now()
 location      | character varying           | not null default ''::character varying
 source        | character varying           | not null default ''::character varying
 speechtext    | text                        | not null
 url           | character varying           | not null default ''::character varying
 release_id    | smallint                    | 
 created       | timestamp without time zone | 
 modified      | timestamp without time zone | 
 speech_tsv    | tsvector                    | 
 key           | boolean                     | 
 summary       | text                        | 
 quote         | text                        | 
Indexes:
    "speech_pk" PRIMARY KEY, btree (speech_id)
    "speech__release_id" btree (release_id)
    "speech__speech_tsv" gin (speech_tsv)
    "speech__speechdate" btree (speechdate)
    "speech__speechtype_id" btree (speechtype_id)

(speechtext будет столбцом, содержащим весь текст для поиска, очевидно)

...