역인덱스
역인덱스 (Inverted indexes)
컬렉션에 "파란색"이라는 단어가 어느 객체들에 들어 있는지 순식간에 찾고 싶다면? 그때 활약하는 것이 역인덱스예요. Weaviate의 역인덱스는 값(단어나 숫자)을 그 값을 포함하는 객체로 매핑해서, 빠른 키워드 검색과 필터링 연산을 가능하게 해 줍니다.
출처: 공식문서
Weaviate가 역인덱스를 만드는 방법
Weaviate의 인덱싱 아키텍처를 이해하는 것은 성능과 리소스 사용을 최적화하는 데 핵심이에요. Weaviate는 각 속성마다, 그리고 각 인덱스 유형마다 별도의 역인덱스를 만듭니다. 다시 말해:
- 컬렉션의 각 속성은 자신만의 전용 역인덱스(들)를 가져요.
- 메타 속성(예: 생성 타임스탬프)도 별도의 역인덱스를 가져요.
- 하나의 속성이 여러 인덱스 유형을 지원하면 여러 개의 역인덱스를 가질 수 있어요.
- 속성 간의 모든 집계와 조합은 인덱스 생성 시점이 아니라 쿼리 시점에 일어나요.
예를 들어 title 속성이 indexFilterable: true와 indexSearchable: true를 모두 가지면, 검색 연산에 최적화된 것과 필터링 연산에 최적화된 것, 두 개의 별도 역인덱스가 생겨요.
이 아키텍처는 유연성과 성능 최적화를 제공하지만, 여러 인덱스 유형을 켜면 저장 공간 요구와 인덱싱 오버헤드가 늘어난다는 뜻이기도 해요.
text 속성의 인덱싱 과정
text 속성의 인덱싱은 다음과 같이 진행돼요.
- 토큰화(Tokenization): 텍스트를 먼저 해당 속성에 설정된 토큰화 방식에 따라 토큰으로 나눠요.
- 인덱스 엔트리 생성: 처리된 각 토큰은 역인덱스에 엔트리를 만들고, 그 토큰을 포함하는 객체를 가리켜요.
이 과정 덕분에 텍스트 검색과 필터가 객체를 빠르게 찾을 수 있어요.
2024년 10월의 성능 개선
Weaviate v1.24.26, v1.25.20, v1.26.6, v1.27.0 버전에서 BM25F 스코어링 알고리즘에 대한 성능 개선과 버그 수정이 도입됐어요.
- BM25 세그먼트 병합 알고리즘을 더 빠르게 만들었어요.
- 소진된 용어를 스코어 계산에서 제거하고 필요한 경우에만 전체 정렬을 하도록 WAND 알고리즘을 개선했어요.
- 모든 세그먼트의 쿼리 용어 스코어를 합산하지 못할 수 있던 BM25F 다중 속성 검색 버그를 해결했어요.
- BM25 스코어를 이제 여러 세그먼트에 대해 동시에 계산해요.
항상 최신 버전으로 업그레이드할 것을 권장해요.
BlockMax WAND 알고리즘
v1.30에서 추가됨
BlockMax WAND 알고리즘은 BM25와 하이브리드 검색을 빠르게 만드는 데 사용되는 WAND 알고리즘의 변형이에요. 인덱스를 블록 단위로 구성해 쿼리와 관련 없는 블록을 건너뛸 수 있게 해요. 이렇게 하면 스코어를 계산해야 하는 문서 수를 크게 줄여 검색 성능을 높일 수 있어요.
BM25(또는 하이브리드) 검색이 느리고 v1.30 이전 버전을 쓰고 있다면, BlockMax WAND 알고리즘을 사용하는 최신 버전으로 마이그레이션해 보세요.
더 알아보기 (Learn more)
- Weaviate 역인덱스 원문: Inverted indexes
- 인덱스 개요: Indexing