2

複合語を適切にサポートするために、ドイツ語のテキストを検索するためのカスタム テキスト検索構成を使用しています。

辞書はhttp://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/ (ispell-german-compound.tar.gz) にあります。

辞書は 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) に別の問題が発生します。

この「起動時間」を短縮する方法はありますか? 新しい接続ごとに構成がロード/作成されているように見えますが、これは合理的ではないようです。

4

1 に答える 1

2

これは既知の問題です - ispell ディクショナリのロードが遅いです (ディクショナリがセッションで初めて使用されるたびにロードされます)。良い解決策の 1 つは、セッション プーリングです。他の解決策は、共有 ispell 辞書 (Tomas Vondra によって作成された拡張機能) を使用することです。shared_ispellですが、PostgreSQL 9.2 以降の新しいバージョンがどの程度サポートされているかはわかりません。9.2 でテストされています。ドイツ語には問題がある可能性があります。チェコ語でテストされています。

別の可能性としては、ドイツ語のスノーボール辞書を使用する方法があります。これは大幅に高速になるはずですが、結果はさらに悪化する可能性があります。全文設定から german_bon_ispell を削除します。

于 2015-06-01T15:09:34.263 に答える