StructArray 개요
하나의 엔티티가 구조화된 요소들의 정렬된 목록을 저장해야 할 때(예: 여러 청크로 구성된 하나의 문서, 여러 시각적 패치로 구성된 하나의 페이지, 또는 여러 클립으로 구성된 하나의 비디오) StructArray를 사용합니다. StructArray는 이러한 요소들을 상위 엔티티 내에 보관하면서도 각 요소 내의 필드에 대해 벡터 검색 및 스칼라 필터링을 수행할 수 있도록 합니다.
StructArray란 무엇인가?
StructArray(구조체 배열이라고도 함)는 각 엔티티 내에 정렬된 Struct 요소 집합을 저장합니다. 배열 내의 모든 Struct 요소는 동일한 스키마를 따릅니다. Struct 요소는 스칼라 하위 필드, 벡터 하위 필드 또는 둘 다를 포함할 수 있습니다.
예를 들어, 컬렉션은 하나의 기사를 엔티티로 저장하고, 그 청크를 ‘ chunks ’라는 이름의 StructArray 필드에 저장할 수 있습니다. 각 청크에는 텍스트, 섹션 메타데이터, 품질 점수, 그리고 하나 이상의 벡터 임베딩이 포함될 수 있습니다.
{
"doc_id": 1,
"title": "Vector search tuning guide",
"category": "search",
"title_vector": [0.10, 0.20, 0.30, 0.40],
"chunks": [
{
"text": "Use HNSW efSearch to trade recall for latency.",
"section": "index",
"page": 1,
"quality_score": 0.92,
"has_code": true,
"emb_list_vector": [0.11, 0.21, 0.31, 0.41],
"emb": [0.12, 0.20, 0.33, 0.39]
},
{
"text": "Range search returns vectors within a distance boundary.",
"section": "search",
"page": 2,
"quality_score": 0.86,
"has_code": false,
"emb_list_vector": [0.18, 0.23, 0.29, 0.36],
"emb": [0.19, 0.24, 0.30, 0.37]
}
]
}
이 예시에서 두 개의 벡터 하위 필드는 두 가지 검색 관점에서 동일한 청크를 나타냅니다. ` chunks[emb_list_vector] `는 ` MAX_SIM* ` 메트릭을 사용하는 EmbeddingList 검색을 위한 것이며, ` chunks[emb] `는 ` COSINE`, ` IP` 또는 ` L2`과 같은 일반 벡터 메트릭을 사용하는 요소 수준 검색을 위한 것입니다.
StructArray 사용 시점
반환하려는 기본 단위가 검색하거나 필터링하려는 기본 단위보다 클 때 StructArray를 사용합니다.
| 사용 사례 | StructArray가 도움이 되는 이유 | 일반적인 StructArray 필드 |
|---|---|---|
| 문서 검색 | 하나의 문서를 엔티티로 저장하면서 해당 문서의 청크 전체를 검색할 때 사용합니다. | chunks |
| 후기 상호작용 검색 | 문서나 페이지를 임베딩 목록으로 저장하고, ` MAX_SIM*`를 사용하여 점수를 산출합니다. | chunks[emb_list_vector] 또는 patches[emb] |
| 요소 수준 검색 | 가장 관련성이 높은 청크, 클립, 패치 또는 관측값을 배열 오프셋과 함께 반환합니다. | chunks[emb] |
| 구조화된 필터링 | section, score, page 또는 flags와 같은 Struct 요소 내의 스칼라 하위 필드를 기준으로 필터링합니다. | chunks[section], chunks[quality_score] |
| 중복된 상위 결과 줄이기 | 각 자식 요소를 별도의 행으로 저장하는 대신, 동일한 부모 엔티티 아래에 자식 요소를 유지합니다. | chunks, clips, patches |
결정 행렬
올바른 StructArray 경로를 선택하려면 다음 행렬을 사용하십시오.
| 목표 | 권장 경로 | 결과 세분화 수준 | 여기서 시작하세요 |
|---|---|---|---|
| 하나의 부모 객체와 여러 개의 구조화된 자식 객체를 모델링합니다. | StructArray 필드를 생성합니다. | 엔티티에는 순서가 지정된 Struct 요소가 포함됩니다. | StructArray 필드 생성 |
| 중첩된 자식 데이터가 포함된 부모 레코드를 삽입합니다. | StructArray 필드가 Struct 객체 목록인 엔티티를 삽입합니다. | 엔티티 수준 삽입. | StructArray 필드에 데이터 삽입 |
| ColBERT, ColPali 또는 문서 수준 후기 상호작용 검색을 실행합니다. | MAX_SIM* 인덱스를 사용하여 EmbeddingList 검색을 수행합니다. | 엔티티 수준. | 임베딩 리스트를 사용하여 검색 |
| 개별 청크, 클립 또는 패치를 검색합니다. | 일반 벡터 메트릭을 사용하여 요소 수준 검색을 수행합니다. | Struct 요소 수준이며, 가능한 경우 오프셋을 사용합니다. | StructArray를 사용한 기본 벡터 검색 |
| 스칼라 조건에 부합하는 요소로만 요소 수준 벡터 검색을 제한합니다. | element_filter 를 사용하십시오. | 요소 수준 필터링; 결과 형상은 검색 유형에 따라 다릅니다. | StructArray를 사용한 필터링 검색 |
| 조건을 만족하는 Struct 요소의 수에 따라 엔티티를 선택합니다. | MATCH_ANY, MATCH_ALL, MATCH_LEAST, MATCH_MOST 또는 MATCH_EXACT 을(를) 사용하십시오. | 엔티티 수준. | StructArray 연산자 |
| StructArray 벡터 하위 필드에 점수 또는 거리 경계를 사용합니다. | 요소 수준 범위 검색을 사용합니다. | Struct 요소 수준. | StructArray를 사용한 범위 검색 |
| 요소 수준 검색 후 부모 엔티티당 최대 하나의 결과를 반환합니다. | 기본 키를 사용한 그룹화 검색을 사용합니다. | 그룹화 후 엔티티 수준. | StructArray를 사용한 그룹화 검색 |
| StructArray 요소 검색을 다른 벡터 필드와 결합합니다. | StructArray 벡터 하위 필드를 대상으로 하는 하나의 AnnSearchRequest를 사용하여 하이브리드 검색을 수행합니다. | 요소 수준 하위 검색, 엔티티 수준 재순위 지정. | StructArray를 활용한 하이브리드 검색 |
두 가지 검색 모델 이해하기
### EmbeddingList 검색 EmbeddingList 검색은 StructArray 벡터 하위 필드 내의 벡터들을 상위 엔티티에 대한 하나의 임베딩 목록으로 취급합니다. 쿼리 역시 임베딩 목록입니다. Milvus는 MAX_SIM* 메트릭을 사용하여 쿼리 임베딩 목록과 저장된 임베딩 목록을 비교하고, 일치하는 엔티티를 반환합니다. - 쿼리 데이터: 임베딩 목록. - 메트릭 계열: MAX_SIM*. - 결과 세분화 수준: 엔티티 수준. - 최적 용도: 문서 수준 또는 페이지 수준의 후기 상호작용 검색. | ### 요소 수준 검색 요소 수준 검색은 각 Struct 요소를 독립적인 벡터 검색 후보로 취급합니다. 각 검색 결과는 StructArray 필드 내의 일치하는 요소를 나타내며, 그룹화되지 않은 결과에서는 요소 오프셋을 확인할 수 있습니다. - 쿼리 데이터: 일반 벡터. - 메트릭 계열: 일반 벡터 메트릭. - 결과 세분화 수준: Struct 요소 수준. - 최적 용도: 청크 수준, 클립 수준 또는 패치 수준의 검색. |
|---|
경고
컬렉션에 EmbeddingList 검색과 요소 수준 검색이 모두 필요한 경우, 두 개의 별도 벡터 하위 필드를 사용하십시오. 벡터 필드 또는 벡터 하위 필드는 하나의 인덱스만 허용하며, 두 검색 모드는 서로 다른 메트릭 계열을 필요로 합니다.
문서 지도
StructArray 문서는 모델링 페이지와 검색 페이지로 나뉩니다. 모델링 페이지를 사용하여 데이터를 정의하고 준비하십시오. 검색 페이지를 사용하여 적절한 검색 및 필터링 동작을 선택하십시오.
| 영역 | 페이지 | 다음 용도로 사용 |
|---|---|---|
| 모델링 | StructArray 필드 생성 | Struct 스키마를 정의하고 StructArray 필드를 추가합니다. |
| 모델링 | StructArray 필드에 데이터 삽입 | 중첩된 StructArray 데이터를 준비하고 삽입합니다. |
| 모델링 | StructArray 필드에 인덱스 지정 | StructArray 하위 필드에 벡터 및 스칼라 인덱스를 생성합니다. |
| 참조 | StructArray 제한 사항 | 스키마, 데이터 유형, 인덱스, 검색, 필터 및 버전 제한 사항을 확인합니다. |
| 검색 | StructArray를 사용한 기본 벡터 검색 | EmbeddingList 검색과 요소 수준 벡터 검색을 비교합니다. |
| 검색 | StructArray를 사용한 범위 검색 | StructArray 벡터 하위 필드에 범위 제약 조건을 적용합니다. |
| 검색 | StructArray를 사용한 그룹화 검색 | 기본 키를 기준으로 요소 수준 검색 결과를 그룹화합니다. |
| 검색 | StructArray를 사용한 하이브리드 검색 | StructArray 요소 수준 검색을 다른 벡터 검색과 결합합니다. |
| 검색 | StructArray를 사용한 필터링 검색 | 검색, 쿼리 및 하이브리드 검색에서 StructArray 필터를 사용합니다. |
| 검색 | 임베딩 목록을 활용한 검색 | StructArray를 사용하여 ColBERT 및 ColPali 방식의 검색 시스템을 구축하세요. |
| 필터 | StructArray 연산자 | element_filter 및 MATCH_* 연산자에 대한 구문 참조. |
먼저 확인해야 할 주요 제한 사항
Struct는 Array 필드의 요소 유형으로 사용할 수 있습니다. 최상위 컬렉션 필드로는 사용되지 않습니다.
동일한 StructArray 필드 내의 모든 Struct 요소는 하나의 사전 정의된 스키마를 공유합니다.
벡터 하위 필드에는 인덱스가 필요합니다. EmbeddingList 검색은
MAX_SIM*메트릭을 사용하는 반면, 요소 수준 검색은 일반 벡터 메트릭을 사용합니다.element_filterMATCH_*는 StructArray 필드 내의 스칼라 하위 필드용입니다. 는 해당 연산자 내에서만 사용하십시오.$[subfield]일부 검색 조합은 버전에 따라 제한되거나 특정 모드에 한정됩니다. 범위 검색, 그룹화 검색, 하이브리드 검색, null 허용 필드 또는 동적으로 추가된 필드를 사용하기 전에 StructArray 제한 사항을 확인하십시오.
다음 단계
스키마를 설계하려면 'StructArray 필드 만들기'를 참조하십시오.
데이터를 준비하려면 'StructArray 필드에 데이터 삽입'을 참조하십시오.
인덱스를 선택하려면 ‘StructArray 필드 인덱싱’을 참조하십시오.
StructArray 벡터 하위 필드를 검색하려면 'StructArray를 사용한 기본 벡터 검색'부터 시작하십시오.
StructArray 스칼라 하위 필드를 필터링하려면 ‘StructArray 연산자’ 및 ‘StructArray를 사용한 필터링 검색’을 참조하십시오.