1 Full text serach
- Azure Search 쿼리 아키텍처 및 고급 검색 기능 분석
1.1 검색 알고리즘 유형 간단 정리
- BM25: 역색인과 용어 통계(TF/IDF 계열)를 사용해 키워드 매칭 기반으로 점수를 매긴다. 빠르고 해석 가능하며 후보 검색(initial retrieval)에 적합하다.
- Vector Search: 문서와 쿼리를 고차원 벡터로 임베딩한 뒤 벡터 유사도(예: 코사인, L2)로 근접 이웃을 찾는다. 의미적 유사성(동의어, 패러프레이즈)을 잘 잡아낸다.
- Semantic Search: Vector Search 또는 Transformer 기반 reranker를 포함하는 상위 개념으로, 의미적 이해를 활용해 결과를 재정렬하거나 직접 답변을 생성한다.
- 실무적 조합: 보통은 BM25로 넓게 후보를 뽑고(cheap), 그 중에서 vector/semantic로 정밀 평가한다 — 성능/비용 균형을 맞추는 표준 패턴.
- 장단점 비교: BM25는 저비용·저지연·해석 가능, vector는 의미성↑·비용↑·지연↑(특히 reranker 사용 시).
1.2 Semantic Search 및 Semantic Answers
1.2.1 Semantic Search 아키텍처
기존 검색 vs Semantic Search
Traditional (BM25):
Query → Token matching → TF-IDF/BM25 → Ranking
Semantic (Deep Learning):
Query → L2 Semantic Reranking → Top-K → Semantic Ranking
↓
Pretrained Transformer (BERT-based)
↓
Contextual understanding
처리 플로우
1. Initial Retrieval (BM25): Top 50 results
↓
2. Semantic Reranking (ML model): Rescore top 50
↓
3. Final Ranking: Return top 10-50 (user requested)
↓
4. Semantic Captions: Extract relevant snippets
↓
5. Semantic Answers: Generate direct answers (optional)
1.2.2 Semantic Configuration
쿼리 요청
{
"search": "how to optimize azure search performance",
"queryType": "semantic",
"semanticConfiguration": "my-semantic-config",
"answers": "extractive|count-3",
"captions": "extractive|highlight-true",
"top": 10
}Semantic Configuration 정의 (인덱스 스키마)
{
"semantic": {
"configurations": [
{
"name": "my-semantic-config",
"prioritizedFields": {
"titleField": {
"fieldName": "title"
},
"prioritizedContentFields": [
{"fieldName": "content"},
{"fieldName": "description"}
],
"prioritizedKeywordsFields": [
{"fieldName": "tags"}
]
}
}
]
}
}필드 우선순위
- Title Field: 가장 높은 가중치 (문서 제목)
- Content Fields: 주요 콘텐츠 (최대 5개)
- Keywords Fields: 메타데이터, 태그 (최대 5개)
1.2.3 Semantic Answers (추출적 답변)
Answers 생성 메커니즘
1. 쿼리와 문서 간 의미론적 유사도 계산
2. 고밀도 답변 후보 구간 식별 (span detection)
3. 답변 품질 스코어링 (0.0-1.0)
4. 상위 N개 답변 추출
Answers vs Captions
| 특성 | Answers | Captions |
|---|---|---|
| 목적 | 직접 답변 (QA) | 관련 컨텍스트 |
| 길이 | 짧음 (1-3 문장) | 중간 (단락 수준) |
| 개수 | 쿼리당 1-5개 | 문서당 1-5개 |
| 점수 | Answer score (0-1) | Relevance score |
1.2.4 성능 및 비용
처리 시간 (Microsoft 벤치마크)
- BM25 only: 평균 50ms
- Semantic reranking: 평균 200-400ms (+4-8배)
- Answers 생성: 추가 +50-100ms
비용 구조 (2024년 기준)
- Semantic Search: Standard 티어 필수
- 월 고정 비용: $500-$1,000 (쿼리 볼륨 무관)
- 쿼리당 과금: 추가 비용 없음 (월 할당량 소진 후 제한)
할당량 (Standard S1)
- 월 1,000개 쿼리 포함
- 초과 시: 월 단위 패키지 구매 필요
사용 권장 시나리오
- 자연어 질문 (QA 스타일)
- 긴 문서 검색 (논문, 기술 문서)
- 낮은-중간 쿼리 볼륨 (<10K/month)
비권장 시나리오
- 키워드 정합 검색 (제품명, ID)
- 고처리량 시스템 (>100K queries/month)
- 실시간 오토컴플리트
1.2.5 Semantic Ranking 정확도
실증 평가 (MS MARCO 데이터셋)
- BM25 baseline: MRR@10 = 0.18
- Semantic Search: MRR@10 = 0.31 (+72% 향상)
- NDCG@10: 0.42 → 0.58 (+38% 향상)
도메인별 성능
- Technical Q&A: +60-80% (의미론적 이해 중요)
- E-commerce: +20-40% (키워드 매칭 여전히 중요)
- News/Media: +40-60% (컨텍스트 이해 필요)
제약사항
- 언어 지원: 영어, 프랑스어, 스페인어, 독일어, 이탈리아어, 포르투갈어, 중국어, 일본어, 한국어 (2024년 기준)
- 쿼리 길이 제한: 최대 1,000 characters
- 문서 크기: 최대 256KB per document
1.3 하이브리드 쿼리 패턴
1.3.1 Filter + Search + Vector
완전한 하이브리드 쿼리
{
"search": "azure ai",
"filter": "category eq 'Technology' and publishDate ge 2023-01-01",
"vectorQueries": [
{
"vector": [0.1, 0.2, ..., 0.8],
"k": 50,
"fields": "contentVector"
}
],
"queryType": "semantic",
"semanticConfiguration": "default",
"top": 10
}실행 순서
1. Filter: Reduce candidate set (bitset operation)
↓
2. Text Search (BM25): Score candidates
↓
3. Vector Search (HNSW): Score candidates
↓
4. RRF Fusion: Combine text + vector scores
↓
5. Semantic Reranking: Refine top 50 (optional)
↓
6. Final Top-K: Return results
RRF (Reciprocal Rank Fusion) 공식
\[\text{RRF}_{\text{combined}}(d) = \sum_{r \in \{r_{\text{text}}, r_{\text{vector}}\}} \frac{1}{k + \text{rank}_r(d)}\]
- \(k\): 상수 (Azure Search 기본값: 60)
- \(\text{rank}_r(d)\): 랭킹 \(r\)에서 문서 \(d\)의 순위
1.3.2 성능 최적화 체크리스트
쿼리 레벨
1. Filter first: 선택도 높은 필터 우선 적용
2. Top-K 최소화: 필요한 만큼만 요청 (기본값: 50)
3. Select 사용: 불필요한 필드 제외
4. Count 조건부 사용: 페이지네이션에만 필요 시 활성화
인덱스 레벨
1. Scoring Profile 최적화: 불필요한 가중치 제거
2. Analyzer 선택: 언어별 최적 analyzer 사용
3. Filterable/Sortable: 필요한 필드만 활성화 (인덱스 크기 영향)
벤치마크 (1M 문서, 최적화 전후)
- 최적화 전: 평균 500ms (filter + search + semantic)
- 최적화 후: 평균 150ms (-70% 개선)
- Filter optimization: -200ms
- Select fields: -100ms
- Top-K reduction: -50ms
1.4 실무 쿼리 패턴 예시
1.4.1 E-commerce 제품 검색
시나리오: 사용자가 “wireless headphones under $100”를 검색
1.4.2 기술 문서 QA 시스템
시나리오: “How to configure Azure Search security?”
{
"search": "configure security azure search",
"queryType": "semantic",
"semanticConfiguration": "docs-semantic",
"answers": "extractive|count-3",
"captions": "extractive|highlight-true",
"filter": "documentType eq 'Tutorial' or documentType eq 'Guide'",
"vectorQueries": [
{
"vector": [...],
"k": 50,
"fields": "contentVector"
}
],
"top": 5
}1.4.3 멀티 테넌트 필터링
시나리오: 테넌트별 데이터 격리
{
"search": "project status",
"filter": "tenantId eq 'tenant-abc-123' and security.viewPermissions/any(p: p eq 'user-xyz')",
"select": "title,status,assignee,tenantId",
"orderby": "lastModified desc"
}보안 고려사항
- 클라이언트에서 tenantId 검증 필수
- API key 대신 Managed Identity 권장
- Row-level security (필터 기반) vs Index-level security
1.5 증거의 강도 및 한계
1.5.1 증거 출처
- Microsoft Learn 공식 문서: Lucene 쿼리 구문, API 명세
- Apache Lucene 공식 문서: BM25 알고리즘 상세
- MS MARCO 벤치마크: Semantic Search 정확도 평가 (Microsoft Research, 2023)
- 성능 수치: Azure Search 공식 벤치마크 및 커뮤니티 테스트
1.5.2 한계점
- 성능 수치 변동성: 인덱스 크기, 하드웨어 티어, 동시 쿼리 수에 따라 ±50% 변동
- Semantic Search 정확도: 데이터셋마다 다름 (MS MARCO 기준이 모든 도메인에 일반화되지 않음)
- 비용 예측: Semantic Search 할당량 소진 속도는 쿼리 복잡도에 의존
- Filter 성능: Collection 필터 (
any/all)는 컬렉션 크기에 선형 비례 (공식 문서에 구체적 제약 미명시)
1.5.3 대안 기술
Elasticsearch
- 더 유연한 쿼리 DSL
- 플러그인 생태계 풍부
- Self-managed 인프라 필요
Solr
- 강력한 Faceting 기능
- Enterprise Search 기능
- 설정 복잡도 높음
Azure 통합 장점
- Managed service (운영 오버헤드 제거)
- Azure OpenAI, Cognitive Services 네이티브 통합
- Semantic Search (BERT 기반) 기본 제공
1.6 불확실성 영역
- Deep Pagination 성능:
skip > 100K시나리오는 공식적으로 차단되어 실제 성능 미측정
- Semantic Search 내부 모델: 정확한 모델 아키텍처 (BERT variant, 파라미터 수) 비공개
- Filter 캐시 정책: 캐시 eviction 전략 및 메모리 할당 세부사항 불명확
- Collection 필터 최적화: Azure가 내부적으로 인덱스를 어떻게 최적화하는지 불명확 (bitmap index 사용 여부 등)
1.7 권장 아키텍처 의사결정 트리
1.7.1 쿼리 전략 선택
쿼리 유형?
├─ 키워드 정합 (제품 ID, 정확한 매칭)
│ └─ Filter only (no search)
│
├─ 자연어 질문 (QA 스타일)
│ └─ Semantic Search + Answers
│ └─ 쿼리 볼륨?
│ ├─ 낮음 (<10K/month) → Semantic enabled
│ └─ 높음 (>10K/month) → Hybrid (BM25 + Vector)
│
└─ 일반 검색 (e-commerce, 문서)
└─ 사용자 유형?
├─ 일반 사용자 → Simple query + Facets
└─ 고급 사용자 → Full Lucene syntax
1.8 참고 링크
1.8.1 Azure Search 쿼리 아키텍처 및 고급 검색 기능
- https://learn.microsoft.com/en-us/azure/search/search-lucene-query-architecture
- https://learn.microsoft.com/en-us/azure/search/search-filters
- https://learn.microsoft.com/en-us/azure/search/search-query-understand-collection-filters
- https://learn.microsoft.com/en-us/azure/search/search-pagination-page-layout
- https://learn.microsoft.com/en-us/azure/search/semantic-answers