DB/엘라스틱서치
기본 dsl
devljy
2024. 10. 31. 10:31
1. 전문 검색 쿼리 (Full text queries) |
// match: 기본 전문 검색. 텍스트를 분석하고 관련 문서를 찾음 { "query": { "match": { "title": "elasticsearch guide" // "elasticsearch" 또는 "guide" 포함 } } } // match_phrase: 정확한 구문 검색. 단어 순서도 중요 { "query": { "match_phrase": { "title": "elasticsearch guide" // "elasticsearch guide" 정확히 이 순서로 } } } // multi_match: 여러 필드에서 동시 검색 { "query": { "multi_match": { "query": "elasticsearch", "fields": ["title", "description"] // title이나 description에서 검색 } } } // query_string: 복잡한 검색 조건을 문자열로 표현 (AND, OR, NOT 사용 가능) { "query": { "query_string": { "query": "(elasticsearch AND guide) OR tutorial" } } } |
2. 정확값 쿼리 (Term level queries) |
// term: 정확히 일치하는 값 검색 (분석하지 않음) { "query": { "term": { "status": "active" // status가 정확히 "active"인 경우만 } } } // terms: 여러 정확한 값 중 하나와 일치 { "query": { "terms": { "status": ["active", "pending"] // active나 pending 중 하나 } } } // range: 범위 검색 { "query": { "range": { "age": { "gte": 20, // 20 이상 "lte": 30 // 30 이하 } } } } // exists: 필드가 존재하는지 확인 { "query": { "exists": { "field": "phone_number" // phone_number 필드가 있는 문서 } } } // prefix: 특정 접두어로 시작하는 값 검색 { "query": { "prefix": { "title": "elastic" // "elastic"으로 시작하는 값 } } } |
3. 복합 쿼리 (Compound queries) |
// bool: 여러 쿼리 조건을 조합 { "query": { "bool": { "must": [ // 반드시 만족해야 함 { "match": { "title": "elasticsearch" } } ], "must_not": [ // 반드시 만족하지 말아야 함 { "match": { "status": "deleted" } } ], "should": [ // 있으면 좋음 (점수에 영향) { "match": { "category": "database" } } ], "filter": [ // 반드시 만족 (점수 영향 없음) { "range": { "price": { "gte": 10 } } } ] } } } // dis_max: 여러 쿼리 중 가장 높은 점수를 선택 { "query": { "dis_max": { "queries": [ { "match": { "title": "Search" }}, { "match": { "content": "Search" }} ], "tie_breaker": 0.3 // 다른 매칭의 점수도 일부 반영 } } } |
4. 조인 쿼리 (Joining queries) |
// nested: 중첩된 객체 내부 검색 { "query": { "nested": { "path": "comments", // 중첩된 필드 경로 "query": { "bool": { "must": [ { "match": { "comments.author": "john" } } ] } } } } } // has_child: 자식 문서 조건으로 부모 검색 { "query": { "has_child": { "type": "comment", // 자식 문서 타입 "query": { "match": { "content": "elasticsearch" } } } } } |
5. 지리정보 쿼리 (Geo queries) |
// geo_distance: 특정 위치에서의 거리 기반 검색 { "query": { "geo_distance": { "distance": "12km", // 반경 12km 내 "location": { "lat": 40, // 위도 "lon": -70 // 경도 } } } } // geo_bounding_box: 지정된 사각형 영역 내 검색 { "query": { "geo_bounding_box": { "location": { "top_left": { // 왼쪽 위 좌표 "lat": 40.73, "lon": -74.1 }, "bottom_right": { // 오른쪽 아래 좌표 "lat": 40.01, "lon": -71.12 } } } } } |
6. 특수 쿼리 (Specialized queries) |
// more_like_this: 유사 문서 검색 { "query": { "more_like_this": { "fields": ["title", "description"], // 비교할 필드들 "like": "Elasticsearch is fast", // 이와 유사한 문서 검색 "min_term_freq": 1, // 최소 단어 빈도 "max_query_terms": 12 // 최대 검색 텀 수 } } } // script_score: 스크립트로 점수 계산 { "query": { "script_score": { "query": { "match_all": {} }, "script": { "source": "doc['price'].value * _score" // 가격과 점수를 곱함 } } } } |