解析许多文档后,我有很多包含乌克兰语文本的行/列,应该为 Postgres 中的全文搜索建立索引。
我发现 Postgres 14 默认支持 29 种语言,但不幸的是不支持乌克兰语。
经过后续挖掘,我发现它允许添加外部字典:
CREATE TEXT SEARCH DICTIONARY my_lang_ispell (
TEMPLATE = ispell,
DictFile = path_to_my_lang_dict_file,
AffFile = path_to_my_lang_affixes_file,
StopWords = path_to_my_lang_astop_words_file
);
但是如何找到最相关的
DictFile
、AffFile
和 StopWords
文件呢?例如,snowball源不包含此语言。
那么,有人可以帮我找到获取
ispell
、aspell
、snowball
或其他乌克兰语词典的最佳方法吗?
谢谢!
经过更深入的探索,在此资源上找到了解决方案dict_uk
sudo snap install gradle
$ cd dict_uk
$ ./gradlew expand
$ cd distr/hunspell/
$ ../../gradlew hunspell
$ sudo cp build/hunspell/uk_UA.aff /usr/share/postgresql/12/tsearch_data/uk_ua.affix
$ sudo cp build/hunspell/uk_UA.dic /usr/share/postgresql/12/tsearch_data/uk_ua.dict
$ sudo cp ../postgresql/ukrainian.stop /usr/share/postgresql/12/tsearch_data/ukrainian.stop
或者只需从 here 下载并解压最新的 hunspell-uk_UA_X.X.X.zip 和 停用词文件
ukrainian
语言的指南:
$ sudo cp uk_UA.aff $(pg_config --sharedir)/tsearch_data/uk_ua.affix
$ sudo cp uk_UA.dic $(pg_config --sharedir)/tsearch_data/uk_ua.dict
$ sudo cp ukrainian.stop $(pg_config --sharedir)/tsearch_data/ukrainian.stop
$ sudo su postgres
$ psql
CREATE TEXT SEARCH DICTIONARY ukrainian_huns (TEMPLATE = ispell, DictFile = uk_ua, AffFile = uk_ua, StopWords = ukrainian);
CREATE TEXT SEARCH DICTIONARY ukrainian_stem (template = simple, stopwords = ukrainian);
CREATE TEXT SEARCH CONFIGURATION ukrainian (PARSER=default);
ALTER TEXT SEARCH CONFIGURATION ukrainian ALTER MAPPING FOR hword, hword_part, word WITH ukrainian_huns, ukrainian_stem;
ALTER TEXT SEARCH CONFIGURATION ukrainian ALTER MAPPING FOR int, uint, numhword, numword, hword_numpart, email, float, file, url, url_path, version, host, sfloat WITH simple;
ALTER TEXT SEARCH CONFIGURATION ukrainian ALTER MAPPING FOR asciihword, asciiword, hword_asciipart WITH english_stem;
# \dFd
...
pg_catalog | english_stem | snowball stemmer for english language
...
public | ukrainian_huns |
public | ukrainian_stem |
现在可以在
to_tsvector
的帮助下创建可搜索列:
ALTER TABLE extracted_pages
ADD COLUMN tsvector_uk tsvector GENERATED ALWAYS AS (
setweight(to_tsvector('ukrainian', coalesce(column_with_text, '')), 'A')
) STORED;
此示例显示了乌克兰语的正确词干:
SELECT to_tsvector('ukrainian', 'солодко дзюрчить джерело і хочеться жити, любити, творити... ');
=> [{"to_tsvector"=>"'джерело':3 'дзюрчати':2 'жити':6 'любити':7 'солодко':1 'творити':8 'хочеться':5"}]
Postgres 全文搜索在质量方面与类似的搜索文本引擎 SphinxSearch 一样,但速度有点慢。
对于大量记录(278_000)的相同查询,它返回相同的结果:
Postgres - ActiveRecord: 67.6ms
SphinxSearch - ActiveRecord: 10.9ms
OS: Ubuntu 20.04
非常感谢,dict_uk支持团队!