在哪里可以找到乌克兰语“ispell”、“aspell”、“snowball”字典以将其添加到 Postgres 中的全文搜索?

问题描述 投票:0回答:1

解析许多文档后,我有很多包含乌克兰语文本的行/列,应该为 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
或其他乌克兰语词典的最佳方法吗?

谢谢!

postgresql dictionary full-text-search snowball ispell
1个回答
5
投票

经过更深入的探索,在此资源上找到了解决方案dict_uk

  1. 通过本指南手动编译文件:
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 和 停用词文件

  1. 按照在 Postgres 中设置 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支持团队!

© www.soinside.com 2019 - 2024. All rights reserved.