2015-06-01 5 views
1

Мы используем пользовательскую конфигурацию текстового поиска для поиска в немецких текстах для правильной поддержки сложных слов.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), который выглядит как проблема кэширования.

Есть ли способ уменьшить это «время запуска»? Это похоже на то, что конфигурация загружается/создается для каждого нового подключения, что просто не кажется разумным.

ответ

2

Известная проблема - загрузка словаря ispell выполняется медленно (он загружается каждый раз, когда словарь используется впервые в сеансе). Одним из эффективных решений является объединение сеансов. Другое решение использует общий словарь ispell - расширение, написанное Томасом Вондра - shared_ispell, но я не знаю, насколько хорошо поддерживается новая версия PostgreSQL 9.2 и выше - она ​​протестирована на 9.2. Там может быть проблема с немецким языком - он протестирован с чешским языком.

Другая возможность - использовать немецкий словарь снежного кома - он должен быть значительно быстрее - но результат может быть хуже. Удалите german_bon_ispell из полнотекстовой конфигурации.

+0

Спасибо за ваш комментарий. Я устал удалять ispell dict, но результаты действительно непригодны. немецкий язык действительно любит сложные слова (например, «Wandkalender» для «настенного календаря»), и снежный ком кажется неудачным для этих слов. Так что я думаю, что я просто придерживаюсь объединения. – masch

 Смежные вопросы

  • Нет связанных вопросов^_^