Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

RediSearch 2.0, 첫 번째 마일스톤 출시

Redis 데이터를 대상으로 다양한 복잡한 질의에 답변할 수 있는 실시간 검색 엔진인 RediSearch의 2.0 버전 개발 과정에서 첫 번째 마일스톤이 출시되었음을 알려드립니다.

이번 마일스톤(2.0-M01)의 핵심은 인덱스와 데이터를 동기화하는 방식이 완전히 재설계되었다는 점입니다. 기존에는 FT.ADD 명령을 통해 인덱스 경유로 데이터를 직접 기록해야 했지만, 이제는 해시(hash)에 기록된 데이터를 RediSearch가 자동으로 추적하여 인덱싱합니다.

이로 인한 가장 큰 장점은 애플리케이션 코드를 전혀 수정하지 않고도 기존 Redis 인스턴스에 RediSearch를 추가하고 보조 인덱스(secondary index)를 생성할 수 있다는 것입니다. RediSearch 모듈을 로드하고 스키마만 정의하면 기존 데이터 위에서 즉시 RediSearch를 활용할 수 있습니다. RediSearch 2.0의 정식 출시(GA)는 올해 가을로 예정되어 있습니다.

(참고: 이번 신규 기능은 아래에 정리된 것처럼 일부 API 변경 사항을 수반합니다. 최대한 하위 호환성을 유지하고자 노력했으나, 이번 경우에는 불가피했습니다. 고객 피드백을 수집하는 과정에서 지속적으로 조정과 수정을 진행할 계획입니다.)

API 변경 사항

앞서 언급한 대로, 이번 RediSearch 2.0 마일스톤에는 여러 가지 API 변경 사항이 포함되어 있습니다.

  1. 인덱스가 더 이상 키 스페이스(keyspace)에 존재하지 않습니다. 예를 들어 인덱스 키(idx:<인덱스명>)를 사용해 데이터베이스의 인덱스 목록을 조회하던 방식은 더 이상 동작하지 않습니다. 대신 데이터베이스 내 모든 인덱스를 반환하는 새로운 명령 FT._LIST가 도입되었습니다.
  2. 인덱스 생성 시 반드시 접두사(prefix)/필터(filter)를 지정해야 합니다. 이를 통해 어떤 문서를 RediSearch가 자동으로 인덱싱할지 결정합니다. 단순한 접두사부터 복잡한 필터 표현식까지 자유롭게 지정할 수 있습니다.
  3. 업그레이드는 지원되지 않습니다. 구버전 RediSearch로 생성된 RDB 파일은 RediSearch 2.0에서 읽을 수 없으며, 현재로서는 전체 데이터셋을 다시 인덱싱해야 합니다. 다만 GA 출시 버전용 업그레이드 프로세스를 준비 중입니다.
  4. Redis 6 이상에서만 동작합니다.
  5. FT 명령이 Redis의 동등한 명령으로 매핑되었습니다. 덕분에 기존 애플리케이션도 RediSearch 2.0에서 계속 동작할 수 있습니다. 매핑 관계는 다음과 같습니다.
    1. FT.ADD => HSET
    2. FT.DEL => DEL (기본값 DD)
    3. FT.GET => HGETALL
    4. FT.MGET => HGETALL
  6. 역색인(inverted index) 자체는 더 이상 RDB에 저장되지 않습니다. 다만 이것이 영속성(persistency) 미지원을 의미하지는 않습니다. RediSearch는 인덱스 정의를 RDB에 저장하고, Redis 시작 후 백그라운드에서 데이터를 다시 인덱싱합니다. FT.INFO 명령으로 인덱싱 상태를 확인하면 재인덱싱 완료 시점을 파악할 수 있습니다.

새로운 API

API의 가장 큰 변화는 인덱스 생성 방식입니다. RediSearch 2.0에서는 FT.CREATE 명령으로 인덱스를 생성하며, 추가된 옵션은 아래에서 확인할 수 있습니다.

FT.CREATE {index}
ON {structure}
[PREFIX {count} {prefix} [{prefix} ..]
[FILTER {filter}]
[LANGUAGE_FIELD {lang_field}]
[LANGUAGE {lang}]
[SCORE_FIELD {score_field}]
[SCORE {score}]
[PAYLOAD_FIELD {payload_field}]
[TEMPORARY {seconds}]
[MAXTEXTFIELDS]
[NOOFFSETS] [NOHL] [NOFIELDS] [NOFREQS]
[STOPWORDS {num} {stopword} ...]
SCHEMA {field} [TEXT [NOSTEM] [WEIGHT {weight}] [PHONETIC {matcher}] | NUMERIC | GEO | TAG [SEPARATOR {sep}] ] [SORTABLE][NOINDEX] ...

주요 세부 사항을 살펴보겠습니다.

  • ON {structure}: 현재는 HASH만 지원합니다.
  • PREFIX {count} {prefix}: 인덱스가 어떤 키를 인덱싱할지 지정합니다. 여러 개의 접두사를 지정할 수 있으며, 이 인수는 선택 사항이라 기본값은 *(모든 키)입니다.
  • FILTER {filter}: RediSearch 집계 표현식 언어 전체를 지원하는 필터 표현식입니다. @__key를 사용해 방금 추가/변경된 키에 접근할 수 있습니다.
  • LANGUAGESCORE: 인덱싱되는 모든 문서의 기본 언어와 점수를 재정의할 수 있습니다.
  • LANGUAGE_FIELD, SCORE_FIELD, PAYLOAD_FIELD: 문서별로 개별적인 언어 및 점수 설정이 가능하며, 페이로드(payload)를 문서 내 필드로 활용할 수 있습니다.

기타 제약 사항 및 변경 사항

RediSearch 2.0-M01 마일스톤에는 그 외에도 몇 가지 업데이트가 포함되어 있습니다.

  • NOSAVE 옵션은 더 이상 지원되지 않습니다.
  • 해시를 갱신하면 문서 전체가 다시 인덱싱됩니다(키스페이스 알림은 어떤 필드가 변경되었는지 알려주지 않음). 따라서 부분 업데이트는 더 느려질 수 있습니다. 이런 상황에서 성능을 개선하기 위한 방안을 계속 연구 중임을 참고해 주세요.
  • 필드 이름이 이제 대소문자를 구분합니다. 따라서 "FOO"로 선언한 필드를 "foo"로 인덱싱하면 동작하지 않습니다.
  • FT.ADD 명령은 아래와 같이 hset으로 매핑됩니다.

FT.ADD idx doc1 1.0 LANGUAGE eng PAYLOAD payload FIELDS f1 v1 f2 v2

위 명령은 다음과 같이 매핑됩니다.

HSET doc1 __score 1.0 __language eng __payload payload f1 v1 f2 v2

즉, 매핑이 의도대로 동작하려면 인덱스의 점수, 언어, 페이로드 필드는 각각 __score, __language, __payload라는 이름을 사용해야 합니다.

  • FT.ADDHASH는 더 이상 지원되지 않습니다. 대신 HSET을 사용하세요.
  • FT.OPTIMIZE는 더 이상 지원되지 않으며, 인덱스 최적화는 RediSearch의 가비지 컬렉션(Garbage Collection) 기능이 담당합니다.

맺음말

이번 변경 사항을 매우 기대하고 있습니다. 이제 기존 Redis 데이터베이스에 RediSearch를 로드하고, 해시에 저장된 기존 데이터를 인덱싱하면서도 문서 조작 시 애플리케이션 로직을 전혀 수정할 필요가 없기 때문입니다. GitHub에서 소스 코드를 받거나 1:99:1 태그의 RediSearch Docker 이미지를 사용해 이번 마일스톤 릴리스를 직접 체험해 보실 수 있습니다. 이 버전은 아직 프로덕션 환경에서 사용할 준비가 되지 않았지만, 여러분의 피드백을 수집하기 위해 미리 공개합니다. 의견이나 이슈는 GitHub 저장소 또는 Redis 커뮤니티 포럼을 통해 공유해 주세요.