필터링 및 전체 텍스트 검색
1) 검색 레이어가 필요한 이유
필터링 및 전체 텍스트 검색 (FTS) 은 기본 키뿐만 아니라 "의미로" 데이터에 빠르게 액세스 할 수 있습니다. 올바르게 설계된 검색 계층은 다음을 결합합
엄격한 필터 (범주, 날짜, 가격, 액세스 권한)
전체 텍스트 (어휘 일치 및 순위)
Facets (탐색을위한 집계)
하이브리드 랭킹 (BM25/TF-IDF + 벡터 수정)
신뢰할 수있는 프로토콜 (커서 페이지 매김, 토큰 TTL, 크로스 샤딩)
2) 건축 사진
구성 요소:1. Ingest/ETL → 지수의 정규화, 중복 제거, 농축, 건물 필드.
2. 인덱서 → 역 인덱스 (토큰 → 문서), 열 구조, 벡터 인덱스 (HNSW/IVF-PQ).
3. 쿼리 레이어 → 요청 파서, 필터/액세스 권한 적용, 샤드 스케줄러, k-way 병합.
4. 랭커 → BM25 + LTR/신경 재 순위.
5. → 캐시, 커서, 패셋, 하이라이트, 자동 완성 서빙.
6. 관찰 가능성 → 대기 시간, 품질 지표, A/B 실험.
3) 데이터 및 인덱스 모델
3. 1 필드 및 분석기
유형: 키워드 (짝수 일치), 텍스트 (분석), 숫자/날짜/지리, 벡터.
분석기: 토큰 화, 정규화 (소문자, 유니 코드 NFKC), 필터 (스톱 워드, 줄기/정규화).
다국어: 필드 당 분석기 (ru, uk, en); ICU 분석; 음역; 분음 부호의 고려.
3. 2 역 색인 (스파 스)
구조: 용어 → 게시 목록 (docID, 용어 freq, 위치).
순위: 필드 부스트가있는 BM25 (또는 클래식 TF-IDF).
3. 3 벡터 지수 (밀도)
텍스트 임베딩 (예: 384-1024 차원).
ANN 구조: HNSW, IVF-PQ, Flat (작은 세트 용).
코사인 근접/내부 제품; BM25 교정 (하이브리드).
3. 4 개의 페이스 및 골재
빠른 카운트에 대한 값의 예약/열 저장.
계층 적 측면 (범주/하위 범주).
범위 (가격 쓰레기통, 날짜).
4) 쿼리: 필터 + 전체 텍스트 + 정렬
4. 1 개의 API 계약 (REST)
요청:
GET /v1/search? q = classic slots & limit = 20 & cursor =... & sort = score: desc, created _ at: desc
&filters=brand:("NetEnt","EGT"); price:[10 TO 50];published_at:[2024-01-01 TO ]
&facets=brand,year,price:range(0,10,20,50,100)
응답 (조각):
json
{
"items": [ { "id":"...", "title":"...", "score": 12. 3, "highlight": { "content": ["..."] } } ],
"facets": { "brand": [{"value":"NetEnt","count":123},...] },
"page": { "limit":20, "has_more":true, "next_cursor":"opaque-token" }
}
4. 2 그래프 QL (단순화)
graphql type Query {
search(query: String!, filter: SearchFilter, first: Int, after: String, sort: [Sort!]): SearchConnection!
}
4. 3 gRPC
proto message SearchRequest {
string query = 1;
map<string,string> filters = 2;
int32 page_size = 3;
string page_token = 4; // курсор repeated string facets = 5;
}
5) 자연어 처리 (NLP)
토큰 화/정규화: 유니 코드 안전, 하이픈/아포스트로피 회계.
스톱 워드: 언어 별 사용자 정의 목록.
Stemming vs lemmatization: ru/uk lemmatization의 경우 더 좋습니다 (품질> 속도).
동의어: 양방향/방향 사전; TTL이있는 사전 버전.
티포 (퍼지): 거리 제한과 정확한 경기 부스트가있는 Damerau-Levenshtein.
N- 그램/에지 -ngram: 자동 완성 및 힌트.
음역: "shch" "u", "kyiv/kyiv" - 대응 규칙.
6) 관련성 및 순위
6. 1 기본 어휘 점수
컬렉션별로 'k1', 'b' 설정이있는 BM25.
필드 별 부스트 (제목 ² 3, 태그 ² 1) 5, 본문> 1).
신선도: '점수 + = 신선도 _ 부스트 (붕괴 (생성 된 _ at))'.
6. 행동 신호 2 개
클릭 스루 속도, 체류 시간, 즐겨 찾기 저장 (위치 방지 bayas 포함).
중복 제거-~ 동일한 컨텐츠 (MinHash/SimHash) 와 문서를 함께 스티치하십시오.
6. 3 LTR (Learning-to-Rank)
특징: 필드 BM25, 길이, 신선도, 인기, 문구 별 일치, 위치 속도.
모델: LambdaMART/XGBoost; 오프라인 메트릭 NDCG @ k, MAP, Precision @ k; 온라인 A/B
6. 4 신경 재 배열
2 단계: 리콜 (BM25/ANN) → 톱 N (예: 200) → 크로스 인코더 재실행.
비용 회계: 시간 예산, 신경 단계가없는 대체.
6. 5 하이브리드 검색 (스파 스 + 밀도)
융합 (속도 및 합계의 정규화) 또는 다단계 (재조정으로 밀도).
최소 최대/z- 스코어/정량적 매핑이 중요합니다.
7) 필터링, 패셋 및 액세스
7. 필터 1 개
운영자: '=', 'IN', 범위, 접두사, 지리 경계 상자/지리 거리.
조합: 필터에 의한 'AND', 일련의 값 내에서 'OR' (브랜드 IN...).
유형 보안: 숫자 필드는 텍스트로 구문 분석되지 않습니다.
7. 2 개의 페이스
사전 계산 된 구조는 저렴합니다.
"응용" 패싯은 나머지 필터 후 패싯을 보여줍니다.
7. 3 액세스/멀티 테넌시
보안 필터는 순위 (사전 필터) 전에 통합됩니다.
문서의 ABAC/RBAC 필드 ('테넌트 _ id', '가시성', 'acl').
요청 토큰이 서명되었습니다. 다중 테넌트-자동 '테넌트 _ id' 필터.
8) 페이지 작성, 커서 및 일관성
시간별로 정렬 할 때 '(점수, 타이 브레이커)' 또는 '(생성 된 _ at, id)' 로 찾기 커서에 의한 페이지 매김.
HMAC 및 TTL의 Opaque 'page _ token'.
일관성: 거의 실시간 (NRT) 지수: 지연 0. 기록과 가시성 사이의 5-2 초. SLA에 문서화하십시오.
크로스 샤드: 로컬 검색 → k-way는 글로벌 순서, 샤드 당 커서를 토큰으로 병합합니다.
9) 자동 완성 및 프롬프트
제안 자: 접두사-trie/edge-ngrams
인기있는 쿼리: 클릭 로그 → 인기 + 개인화 (세그먼트) 에 대한 팁.
맞춤법: 거리 제한 '<= 1' 을 사용한 빠른 퍼지 검색.
GET /v1/suggest? q=kaz&limit=8&locale=ru
→ ["casino," "casual games,..."]
10) 하이라이트 및 스 니펫
위치 인덱스 → 일치하는 문구를 검색합니다.
HTML은 인접한 조각들의 이스케이프, 길이 제한, 결합
관련 용어의 밀도에 의한 스 니펫 순위.
11) 성능, 캐시 및 SLO
색인: 메모리의 핫 세그먼트; 압축 게시물; 패싯에 대한 문서 값.
캐시: L1 (프로세스), L2 (Redis), 패셋/집계 캐시; 인덱스 버전으로 비활성화됩니다
SLO: 'k <= 20' 에서 P95 <150-200 ms, P99 <500 ms; 가용성 99. 9%.
역압: 'k' 를 줄이고 과부하시 신경 단계를 비활성화하십시오.
그림% 1개의 캡션을 편집했습니다.
12) 관찰 가능성 및 품질 지표
기술 지표:- '검색 _ latency _ ms' (P50/P95/P99), 'qps', '타임 아웃', '오류 _ 인종'
- 'cash _ hit _ ratio', 'facet _ cash _ hit', 'rerank _ share'
- 'shard _ fanout', 'merge _ time _ ms', 'ann _ recall @ k'
- 표시된 샘플의 NDCG @ k, MAP, MRR, Recall @ k, Precision @ k.
- CTR @ k, sCTR (만족스러운 클릭), 체류 시간, о족 (pogostick rate).
A/B: "가드 레일" 메트릭 (대기 시간, 오류) + 대상 (NDCG 프록시) 을 수정합니다.
13) 테스트
관련 단위 테스트: 주요 요청에 대한 예상 일치 확인.
속성 기반: 오타/동의어/언어에 대한 저항.
Pagination: 페이지 경계에 중복이 없습니다 (계약을 찾으십시오).
보안: 액세스 필터는 항상 적용됩니다 (faset-count에서도).
사전 회귀: 동의어 및 퍼지 규칙 버전.
14) 보안 및 개인 정보 보호
PII가있는 필드는 텍스트로 색인되지 않습니다. 별도로 저장/암호화.
저장된 소스를 최소화합니다 (저장 = 거짓, 스 니펫 필드 만 해당).
프라이버시 쿼리: 원시 요청을 PII로 기록하지 마십시오. 익명화/해싱.
멀티 테넌트: 엄격한 인덱스 격리 또는 필수 '테넌트 _ id' 필터.
15) 이주 및 상호 운용성
이중 쓰기 및 점진적 스위치가있는 Versioning 인덱스 체계 (v1 → v2).
분석기 호환성: 이전 체인을 다시 색인화하지 마십시오.
동의어/스톱 워드 사전의 회전: '버전', '활성화 _ at', 롤백.
16) 실용적인 요리법
16. 1 클래식 어휘 검색 (BM25)
필드: '제목 ² 3', '태그 ² 2', '본문> 1'.
분석기: 언어 별 + 정리.
짧은 쿼리 ('<= 3' 토큰), 'fuzziness = 1' 의 퍼지.
16. 2 하이브리드 스파 스 + 조밀
1. 쿼리 포함에 의한 ANN 검색 (k = 200)
2. Top-200 BM25와 병합
3. 교정 순위 융합
4. 선택적으로 충분한 예산으로 최고 N (N = 20) 을 사용하십시오.
16. 3 페이스 카탈로그 탐색
권리/테넌트 별 하드 사전 필터
필터 후 패셋 (활성 필터를 포함한 수)
관련성 또는 비즈니스 분야별로 정렬 (가격/참신)
17) 샘플 요청 (pseudo-DSL)
필터 및 정렬:json
{
"query": "live casino,"
"filters": {
"country": ["EE","LV","LT"],
"license": ["MGA","UKGC"],
"launched_at": {"gte": "2023-01-01"}
},
"sort": ["_score:desc","launched_at:desc"],
"facets": ["country","license"],
"page": {"limit": 20, "cursor": "opaque"}
}
Geopoisk:
json
{
"query": "casino",
"geo": {"lat": 59. 437, "lon": 24. 753, "radius_km": 50}
}
자동 완료:
json
{ "prefix": "evo", "field": "brand_suggest", "limit": 8 }
18) UX 패턴
액티브 필터 칩 + "모두 재설정".
빈 결과: "시도"... (동의어, 필터 제거).
제로 힌트: 인기있는 쿼리/카테고리.
커서 페이지 매김 (추가 버튼) 및 무한 스크롤; 적용된 필터의 고정 표시기.
별도의 스위치는 "오타를 고려합니다", "문구의 정확한 일치" 입니다.
19) 빈번한 오류 및 패턴 방지
→ 복식/점프를 정렬 할 때 타이 브레이커가 없습니다.
활성 필터를 고려하지 않은 페이스 북 → "거짓" 수
순위 액세스 필터를 적용하십시오.
하나의 분석기와 다른 언어를 혼합합니다.
커서를 찾는 대신 깊은 페이지 매김 OFFSET/LIMIT.
대기 시간에 의한 무제한 퍼지 → 폭발.
20) 구현 점검표
1. 필드와 유형을 정의하고 로케일 당 분석기를 할당하십시오.
2. 역 인덱스 + 를 설계하십시오 (선택 사항). 벡터 ANN.
3. 쿼리 파서를 구현하고 사전 필터를 보호하십시오.
4. BM25 및 필드 부스트 설정; 패싯을 부착하십시오.
5. 커서 (불투명, HMAC, TTL) 를 입력하고 k- 웨이를 파편으로 병합하십시오.
6. 자동 완성, 하이라이트, 안전한 차폐를 추가하십시오.
7. 측정 항목: 대기 시간, NDCG @ k, CTR; L1/L2 캐시.
8. 튜닝 관련성을위한 A/B 프레임 워크.
9. 문서 SLA: NRT 지연, '제한' 한계, 일관성 보장.
10. 마이그레이션 계획: 색인, 사전 및 분석기 버전.
잘 설계된 필터링 및 전체 텍스트 검색 계층은 빠른 인덱스 일뿐만 아니라 커서, 보안, 예측 가능한 UX 및 측정 가능한 관련성과의 명확한 프로토콜 계약입니다. 이 접근 방식은 수천에서 수십억 개의 문서로 확장되며 신경망 순위가있는 고전적인 어휘 검색 및 최신 하이브리드 시나리오를 모두 지원합니다.