我们正在使用自定义文本搜索配置来搜索德语文本,以正确支持复合词。
字典可以在这里找到: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。但这引入了一些其他问题,看起来像一个缓存问题。
有什么办法可以减少这个“启动时间”?看起来好像为每个新连接加载/创建了配置,这似乎并不合理。