자, 체코어 포럼 인스턴스에서 검색 기능을 개선하기 위한 제 여정에 대한 이야기를 해보겠습니다.
불행히도 현재 PostgreSQL(12)에는 내장 체코어 사전이 제공되지 않습니다. 체코어는 7개의 격변화(즉, 문맥에 따라 명사가 7가지 다른 형태를 취할 수 있음)를 가지므로, 상상할 수 있듯이 검색 기능이 우리에게서는 매우 부진하게 작동합니다.
저는 사전 추가 방법과 docker 인스턴스 내에서 작동시키는 방법을 알아냈습니다(자세한 내용은 아래 참조) 하지만, 재인덱싱 후에도 여전히 작동하지 않았습니다. 나중에 보니 Discourse는 default_locale 설정을 기반으로 사전을 선택하며, Postgres와 함께 제공되는 언어에만 해당 사전을 선택하고 나머지 모든 언어에는 simple 사전을 사용한다는 사실을 알게 되었습니다.
부탁드립니다. 커스텀 검색 사전을 지정할 수 있는 추가 사이트 설정을 받을 수 있을까요?
lib/search.rb 파일을 수동으로 편집하면 모든 것이 정상적으로 작동하기 시작한다는 것을 확인했습니다.
사전을 추가하기 위해 제가 수행한 작업은 기본적으로 여기의 단계를 재현한 것입니다:
그리고 여기:
sudo ./launcher enter app
# 아래 내용은 컨테이너 재빌드 시마다 실행되도록 container/app.yml에도 추가해야 합니다
curl -L https://github.com/freaz/docker-postgres-czech-unaccent/raw/master/czech_unaccent.tar.gz | tar -xzC /tmp/ && mv /tmp/fulltext_dicts/czech* /usr/share/postgresql/1?/tsearch_data/
sudo -u postgres psql discourse
CREATE TEXT SEARCH DICTIONARY czech
(template=ispell, dictfile = czech_unaccent, afffile=czech_unaccent, stopwords=czech_unaccent);
CREATE TEXT SEARCH CONFIGURATION czech (copy=english);
ALTER TEXT SEARCH CONFIGURATION czech
ALTER MAPPING FOR word, asciiword WITH cspell, simple;
# 확인
\dF
# 테스트
select * from ts_debug('czech_unaccent','Prilis zlutoucky kun se napil zlute vody');
Ctrl-D
rake search:reindex
Ctrl-D
# containers/app.yml에서 설정
db_default_text_search_config: "public.czech"
# 재빌드
발음 표기(diacritics)와 관련하여 또 하나의 함정이 있습니다. 위의 접근 방식은 음소기호 없는 사전을 다운로드하므로 search ignore accents(검색 시 음소기호 무시) 설정이 켜져 있을 때 함께 작동합니다. 음소기호를 포함한 검색을 원한다면 https://postgres.cz/data/czech.tar.gz 에서 사전을 다운로드해야 합니다.
이 함정은 Postgres 기본 지원이 있는 다른 언어에도 적용된다고 생각합니다.
음소기호를 제거하면, 음소기호가 포함된 단어에 대해 해당 언어의 스테머(stemmer)를 사실상 끄는 것과 같습니다. 따라서 이 기능이 이러한 언어에 대해 켜져 있어야 하는지 전혀 명확하지 않습니다.