콘텐츠로 이동

Tokenization

text 필드의 색인·검색 품질은 tokenizer와 사전 선택에 따라 달라집니다. AkasicDB text search는 필드별로 analyzer를 지정할 수 있으며, 한국어는 lindera와 ko-dic 기반 형태소 분석을 사용합니다. tokenizer와 사전 구성은 인덱스 정의(필드 매핑)의 일부이며, 별도의 등록 SQL은 없습니다.

이 페이지의 예제도 Indexing과 같은 docs_texton_idx 이름을 재사용하므로, 각 예제 앞에 DROP INDEX IF EXISTS를 둡니다(사용자 사전 예제는 예외입니다 — 아래에서 설명합니다).

Standard Analyzer

매핑에서 analyzer를 지정하지 않은 text 필드는 언어 중립 standard analyzer로 색인됩니다. standard는 공백·구두점으로 토큰을 분리하고 소문자로 정규화합니다. 형태소 분석이 필요 없는 영문·코드·식별자 필드에 적합합니다.

한국어 형태소 분석 (lindera ko-dic)

한국어 필드는 lindera tokenizer와 ko-dic 사전으로 형태소 분석해 색인·검색합니다. 예를 들어 국제공항에서는 국제 / 공항 / 에서로 분리되어, 어절 경계와 무관하게 매치됩니다.

DROP INDEX IF EXISTS docs_texton_idx;

CREATE INDEX docs_texton_idx
  ON docs
  USING texton ((docs.*))
  WITH (mapping='{"fields":{
    "body":{"type":"text","analyzer":{"tokenizer":{"lindera":{"dictionary":"ko-dic"}}}}
  }}');

ko-dic main dictionary는 확장 바이너리에 임베드되어 있어 별도의 사전 배치가 필요 없습니다.

필드별 사전

한 인덱스 안에서 필드마다 서로 다른 tokenizer와 언어 사전을 쓸 수 있습니다. text 필드마다 analyzer를 명시하면 됩니다.

DROP INDEX IF EXISTS docs_texton_idx;

CREATE INDEX docs_texton_idx
  ON docs
  USING texton ((docs.*))
  WITH (mapping='{"fields":{
    "title":{"type":"text","analyzer":{"tokenizer":{"lindera":{"dictionary":"ko-dic"}}}},
    "body_en":{"type":"text"}
  }}');

Note

ipadic / unidic / cc-cedict / jieba 등 옵트인 CJK 사전은 해당 사전을 포함해 빌드된(build feature) 확장에서만 사용할 수 있습니다. 사용 중인 빌드에 포함된 사전은 배포 구성에 따라 다릅니다.

사용자 사전

도메인 용어나 신조어를 색인 단위로 인식시키려면 사용자 사전을 지정합니다. 사용자 사전은 lindera-cli로 컴파일된 바이너리이며, 필드별 user_dictionary 경로로 선언합니다. AkasicDB text search는 사전의 내용이 아니라 바이너리 경로만 참조합니다.

이 예제만 별도 인덱스 이름을 씁니다. 선언한 경로에 사전 바이너리가 실제로 없으면 CREATE INDEX가 실패하는데, 같은 이름을 재사용하면 앞 예제로 만든 docs_texton_idx까지 함께 사라지기 때문입니다.

CREATE INDEX docs_userdict_texton_idx
  ON docs
  USING texton ((docs.*))
  WITH (mapping='{"fields":{
    "body":{"type":"text","analyzer":{"tokenizer":{"lindera":{
      "dictionary":"ko-dic","user_dictionary":"/var/lib/texton/dict/ko.bin"}}}}
  }}');

사전 경로 화이트리스트

임의 경로 읽기를 제한하려면 사전 경로 화이트리스트 GUC를 설정합니다. 설정하면 이 디렉토리 하위 경로만 사용자 사전으로 허용되며, 값 변경은 슈퍼유저만 할 수 있습니다.

SET texton.dictionary_base_dir = '/var/lib/texton/dict';

사전 갱신 반영

필드 매핑은 인덱스를 만든 뒤 in-place로 변경되지 않으므로, 사전을 바꿔도 자동으로 재색인되지 않습니다. 같은 경로에 사전 바이너리를 재컴파일한 뒤 REINDEX하면 새 사전이 반영됩니다.

-- 같은 위치에 사용자 사전 바이너리를 재컴파일한 뒤:
REINDEX INDEX docs_texton_idx;

사전 경로 자체를 바꿔야 하면 매핑의 user_dictionary를 수정해 인덱스를 다시 만듭니다.