Postgres вопрос о полнотекстовом поиске - PullRequest
2 голосов
/ 16 ноября 2010

Производительность полнотекстового поиска Postgres зависит от используемого вами словаря. Вот пример

моя таблица содержит 60000 записей

словарь немецкого языка по умолчанию (я думаю, только стоп-слова) SELECT title FROM sitesearch s, to_tsquery('german','holz') query WHERE query @@ searchtext LIMIT 10 QUERY PLAN

Limit  (cost=247.14..282.99 rows=10 width=21) (actual time=1.286..1.534 rows=10 loops=1)
  ->  Nested Loop  (cost=247.14..1358.57 rows=310 width=21) (actual time=1.278..1.512 rows=10 loops=1)
        ->  Function Scan on query  (cost=0.00..0.01 rows=1 width=32) (actual time=0.019..0.019 rows=1 loops=1)
        ->  Bitmap Heap Scan on sitesearch s  (cost=247.14..1354.68 rows=310 width=570) (actual time=1.237..1.452 rows=10 loops=1)
              Recheck Cond: (query.query @@ s.searchtext)
              ->  Bitmap Index Scan on sitesearch_searchtext_idx  (cost=0.00..247.06 rows=310 width=0) (actual time=0.871..0.871 rows=1144 loops=1)
                    Index Cond: (query.query @@ s.searchtext)
Total runtime: 1.815 ms
8 row(s)

Total runtime: 13.414 ms

это довольно быстро

мой словарь немецкий ispell

CREATE TEXT SEARCH DICTIONARY pg_german (
    TEMPLATE = ispell,
    DictFile = german,
    AffFile = german,
    StopWords = german
);

включена поддержка составных слов
dictfile: 319018 слов
файл аффикса: 1290 строк
стоп-слова: 264 слова

SELECT title FROM sitesearch s, to_tsquery('public.pg_german','holz') query WHERE query @@ searchtext LIMIT 10

план запроса

Limit  (cost=247.14..282.99 rows=10 width=21) (actual time=1.263..1.578 rows=10 loops=1)
  ->  Nested Loop  (cost=247.14..1358.57 rows=310 width=21) (actual time=1.255..1.556 rows=10 loops=1)
        ->  Function Scan on query  (cost=0.00..0.01 rows=1 width=32) (actual time=0.009..0.009 rows=1 loops=1)
        ->  Bitmap Heap Scan on sitesearch s  (cost=247.14..1354.68 rows=310 width=570) (actual time=1.229..1.495 rows=10 loops=1)
              Recheck Cond: (query.query @@ s.searchtext)
              ->  Bitmap Index Scan on sitesearch_searchtext_idx  (cost=0.00..247.06 rows=310 width=0) (actual time=0.896..0.896 rows=1144 loops=1)
                    Index Cond: (query.query @@ s.searchtext)
Total runtime: 1.818 ms
8 row(s)

Total runtime: 1,520.428 ms

план запроса быстрый ... 1,5 с общего времени выполнения? это займет много времени, чтобы загрузить / инициализировать словарь? Как ускорить этот процесс?

спасибо!

1 Ответ

2 голосов
/ 16 ноября 2010

Да, словари ispell загружаются очень медленно при первой загрузке.Если вы используете их, вам действительно нужно использовать пул соединений - они занимают время только в первый раз, когда они загружаются для каждого соединения.

Работа над этим выполняется для 9.1, но для текущих версий выВы застряли с этим требованием.

...