С тем, что я смог собрать до сих пор, если вам нужно запустить полнотекстовый поиск по таблице в базе данных 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
будет столбцом, содержащим весь текст для поиска, очевидно)