본문 바로가기
WIKI 기술 지식 베이스

INVERTED 인덱스 (INVERTED)

원문 보기 위키 갱신

데이터에 잦은 필터 쿼리를 수행해야 할 때, INVERTED 인덱스는 쿼리 성능을 크게 향상시킬 수 있어요. 모든 문서를 스캔하는 대신 Milvus는 역인덱스(inverted index)를 사용해 필터 조건과 일치하는 정확한 레코드를 빠르게 찾아요.

출처: Milvus 문서

본문

INVERTED 인덱스를 언제 사용하나요?

다음과 같은 경우에 INVERTED 인덱스를 사용해요:

  • 특정 값으로 필터링: 필드가 특정 값과 같은 모든 레코드를 찾을 때 (예: category == "electronics")

  • 텍스트 내용 필터링: VARCHAR 필드에서 효율적인 검색을 수행할 때

  • JSON 필드 값 조회: JSON 구조 안의 특정 키로 필터링할 때

성능 이점: INVERTED 인덱스는 전체 컬렉션 스캔을 제거해 대용량 데이터셋에서 쿼리 시간을 초 단위에서 밀리초 단위로 줄일 수 있어요.

INVERTED 인덱스는 어떻게 동작하나요?

Milvus의 INVERTED 인덱스는 각 고유 필드 값(term)을 해당 값이 나타나는 문서 ID 집합에 매핑해요. 이 구조 덕분에 반복되거나 범주형(categorical) 값이 있는 필드를 빠르게 조회할 수 있어요.

다이어그램에서 보듯 이 과정은 두 단계로 동작해요:

  • 정방향 매핑 (ID → Term): 각 문서 ID가 자신이 담고 있는 필드 값을 가리켜요.

  • 역방향 매핑 (Term → IDs): Milvus가 고유한 term을 모아 각 term에서 그 term을 포함하는 모든 ID로의 역 매핑을 만들어요.

예를 들어 "electronics" 값은 ID 1과 3에 매핑되고, "books" 는 ID 2와 5에 매핑돼요.

특정 값을 필터링할 때(예: category == "electronics") Milvus는 인덱스에서 term을 조회해 일치하는 ID를 직접 가져와요. 이렇게 하면 전체 데이터셋을 스캔하지 않아도 돼서, 특히 범주형이나 반복되는 값의 필터링이 빨라져요.

INVERTED 인덱스는 BOOL, INT8, INT16, INT32, INT64, FLOAT, DOUBLE, VARCHAR, JSON, ARRAY 같은 모든 스칼라 필드 타입을 지원해요. 다만 JSON 필드를 인덱싱할 때의 인덱스 파라미터는 일반 스칼라 필드와 조금 달라요.

비-JSON 필드에 인덱스 만들기 (Create indexes on non-JSON fields)

비-JSON 필드에 인덱스를 만들려면 다음 단계를 따라요.

인덱스 파라미터를 준비해요:

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530") # Replace with your server address

# Create an empty index parameter object
index_params = client.prepare_index_params()

INVERTED 인덱스를 추가해요:

index_params.add_index(
    field_name="category",           # Name of the field to index
    index_type="INVERTED",          # Specify INVERTED index type
    index_name="category_index"     # Give your index a name
)

인덱스를 만들어요:

client.create_index(
    collection_name="my_collection", # Replace with your collection name
    index_params=index_params
)

JSON 필드에 인덱스 만들기 (Create indexes on JSON fields) — Milvus 2.5.11+ 호환

JSON 필드 안의 특정 경로에도 INVERTED 인덱스를 만들 수 있어요. 이때는 JSON 경로와 데이터 타입을 지정하는 추가 파라미터가 필요해요:

# Build index params
index_params.add_index(
    field_name="metadata",                    # JSON field name
    index_type="INVERTED",
    index_name="metadata_category_index",
    params={
        "json_path": "metadata[\"category\"]",    # Path to the JSON key
        "json_cast_type": "varchar"              # Data type to cast to during indexing
    }
)

# Create index
client.create_index(
    collection_name="my_collection", # Replace with your collection name
    index_params=index_params
)

JSON 필드 인덱싱의 자세한 내용(지원되는 경로, 데이터 타입, 제한 사항 포함)은 JSON Indexing을 참고하세요.

인덱스 제거하기 (Drop an index)

컬렉션에서 기존 인덱스를 제거하려면 drop_index() 메서드를 사용해요.

  • v2.6.3 이하에서는 스칼라 인덱스를 제거하기 전에 컬렉션을 릴리스(release)해야 해요.

  • v2.6.4 이상부터는 더 이상 필요 없어지면 컬렉션을 먼저 릴리스하지 않아도 스칼라 인덱스를 바로 제거할 수 있어요.

client.drop_index(
    collection_name="my_collection",   # Name of the collection
    index_name="category_index" # Name of the index to drop
)

모범 사례 (Best practices)

  • 데이터를 로드한 뒤 인덱스 만들기: 이미 데이터가 있는 컬렉션에 인덱스를 만들면 성능이 더 좋아져요.

  • 의미 있는 인덱스 이름 사용하기: 필드와 용도를 분명히 알 수 있는 이름을 선택해요.

  • 인덱스 성능 모니터링: 인덱스를 만들기 전과 후의 쿼리 성능을 확인해요.

  • 쿼리 패턴 고려하기: 자주 필터링하는 필드에 인덱스를 만들어요.

더 알아보기 (Learn more)