gpt4 book ai didi

performance - 第一次查询时的 Postgres tsearch 性能

转载 作者:行者123 更新时间:2023-11-29 12:11:43 25 4
gpt4 key购买 nike

我们正在使用自定义文本搜索配置在德语文本中搜索以正确支持复合词。

字典可以在这里找到: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;

字典本身运行良好,但在每个新连接/ session 中,使用此配置的第一个查询需要 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 字典很慢(每次在 session 中第一次使用字典时都会加载)。一个很好的解决方案是 session 池。其他解决方案是使用共享 ispell 字典 - 由 Tomas Vondra 编写的扩展 - shared_ispell ,但我不知道某些新版本的 PostgreSQL 9.2 及更高版本的支持情况如何 - 它已在 9.2 上进行了测试。德语可能有问题 - 它已通过捷克语测试。

另一种可能性是使用德语滚雪球词典——它应该明显更快——但结果可能更糟。从全文配置中删除 german_bon_ispell。

关于performance - 第一次查询时的 Postgres tsearch 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30576514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com