Мы используем пользовательскую конфигурацию текстового поиска для поиска в немецких текстах для правильной поддержки сложных слов.Postgres tsearch performance при первом запросе
Словарь можно найти здесь: http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/ (ispell-german-compound.tar.gz).
В dicts был преобразован в UTF8, и я использовал следующий сценарий, чтобы добавить конфигурацию в базу данных:
DROP TEXT SEARCH DICTIONARY IF EXISTS german_bon_ispell CASCADE;
DROP TEXT SEARCH DICTIONARY IF EXISTS german_bon_stem CASCADE;
CREATE TEXT SEARCH CONFIGURATION german_bon (copy=german);
CREATE TEXT SEARCH DICTIONARY german_bon_stem (
TEMPLATE = snowball,
Language = german,
StopWords = german
);
CREATE TEXT SEARCH DICTIONARY german_bon_ispell (
TEMPLATE = ispell,
dictfile = german,
afffile = german,
StopWords = german
);
ALTER TEXT SEARCH CONFIGURATION german_bon
ALTER MAPPING FOR
asciiword,word,numword,numhword,hword_asciipart,hword_part,hword_numpart
WITH german_bon_ispell, german_bon_stem;
Словарь сам прекрасно работает, но при каждом новом подключении/сессии первый запрос с помощью этой конфигурации занимает 1-2 секунды. Каждые ~ 1-3 мс.
Этот эффект наблюдается также для английского словаря, но не то, что резкое:
db=# \timing
Timing is on.
db=# select ts_debug('english', 'Book');
ts_debug
-----------------------------------------------------------------------
(asciiword,"Word, all ASCII",Book,{english_stem},english_stem,{book})
(1 row)
Time: 6,977 ms
db=# select ts_debug('english', 'Book');
ts_debug
-----------------------------------------------------------------------
(asciiword,"Word, all ASCII",Book,{english_stem},english_stem,{book})
(1 row)
Time: 2,258 ms
db=# select ts_debug('german_bon', 'Buch');
ts_debug
---------------------------------------------------------------------------------------------------
(asciiword,"Word, all ASCII",Buch,"{german_bon_ispell,german_bon_stem}",german_bon_ispell,{buch})
(1 row)
Time: 916,286 ms
db=# select ts_debug('german_bon', 'Buch');
ts_debug
---------------------------------------------------------------------------------------------------
(asciiword,"Word, all ASCII",Buch,"{german_bon_ispell,german_bon_stem}",german_bon_ispell,{buch})
(1 row)
Time: 1,240 ms
db=#
Единственная работа вокруг я в настоящее время известно о является использование постоянных соединений/пулов соединений и мы используем pgbouncer для этого. Но это создает некоторые другие проблемы с клиентом (PHP> PDO> Doctrine), который выглядит как проблема кэширования.
Есть ли способ уменьшить это «время запуска»? Это похоже на то, что конфигурация загружается/создается для каждого нового подключения, что просто не кажется разумным.
Спасибо за ваш комментарий. Я устал удалять ispell dict, но результаты действительно непригодны. немецкий язык действительно любит сложные слова (например, «Wandkalender» для «настенного календаря»), и снежный ком кажется неудачным для этих слов. Так что я думаю, что я просто придерживаюсь объединения. – masch