문서

필터 연산자

버킷 검색 메타데이터 필터를 위한 SQL 스타일 연산자 — eq, ne, like, prefix, in, gt/gte/lt/lte, exists.

버킷 검색은 메타데이터로 결과를 좁히는 filter 객체를 받습니다. 평범한 스칼라 값은 정확 일치(하위 호환)이며, 객체 형태로 감싸면 풍부한 술어를 표현할 수 있습니다.

연산자

연산자타입예시설명
eqany{"eq": "urgent"}정확 일치. 엔진 fast path로 lower.
neany{"ne": "draft"}불일치. Post-filter.
likestring{"like": "%legal%"}SQL LIKE: %=임의 문자, _=한 글자, \% / \_=리터럴. 대소문자 무시.
prefixstring{"prefix": "2024-"}시작 문자열. 대소문자 무시.
inarray{"in": ["a","b","c"]}리스트 멤버십. 최대 100개.
gt / gtenumber / ISO date{"gte": 0.8}큼(이상). 숫자 우선, ISO date 문자열 fallback.
lt / ltenumber / ISO date{"lt": 100}작음(이하).
existsboolean{"exists": true}true=필드 존재+비어있지 않음, false=없음.

예시

bashcurl -X POST https://api.schift.io/v1/buckets/{bucket_id}/search \
  -H "Authorization: Bearer $SCHIFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "소방시설 점검 주기",
    "top_k": 10,
    "min_score": 0.6,
    "filter": {
      "tag": "urgent",
      "source_url": {"like": "%fire-safety%"},
      "filename":   {"prefix": "2024-"},
      "doc_type":   {"in": ["policy", "spec"]},
      "score":      {"gte": 0.8},
      "stage":      {"ne": "draft"},
      "author":     {"exists": true}
    }
  }'

필터는 AND로 결합됩니다

최상위 연산자 절은 모두 일치해야 합니다. 같은 키 안에서 OR은 in, 키 간 OR은 아래 $or을 사용하세요.

키 간 OR (`$or`)

서로 다른 메타데이터 키에 대한 OR이 필요하면 $or을 사용합니다. 각 arm은 완전한 sub-filter 딕셔너리이며 모든 연산자를 지원합니다.

json{
  "filter": {
    "doc_type": "policy",
    "$or": [
      {"severity": "high"},
      {"priority": {"in": ["P0", "P1"]}}
    ]
  }
}

위는 doc_type=policy AND (severity=high OR priority∈{P0,P1})로 매칭됩니다. 중첩 3단계까지, $or당 arm 16개 cap.

결과 랭킹

필터는 점수를 변경하지 않고 후보를 가지치기만 합니다. Post-filter 연산자가 있으면 엔진이 top_k * 3 후보를 가져와 shrinkage를 흡수한 뒤 top_k로 자릅니다.

min_score

최상위 min_score (0.0–1.0)는 rerank 이후 최종 점수가 임계값 미만인 hit을 제거합니다. 챗봇 파이프라인의 hallucination 방어선으로 유용합니다.

안전장치

패턴 길이 256자, wildcard 16개, in 리스트 100개 캡. 패턴은 anchored case-insensitive regex로 변환되며 모든 정규식 메타문자는 escape됩니다 — SQL injection surface 없음.