ES|QL 검색
원본 보기ES|QL 검색
이 페이지에서는 검색 활용 사례에 ES|QL을 사용하는 방법을 개괄적으로 설명합니다.
실습 튜토리얼은 ES|QL로 검색하고 필터링하기를 참고하세요.
다음 표는 ES|QL에서 사용할 수 있는 주요 검색 기능과 도입 시점을 스택 버전별로 시간순으로 정리한 것입니다.
기능은 보통 스택 버전 기반 배포보다 Elastic Cloud Serverless에서 먼저 제공됩니다.
| 기능 | 설명 | 지원 버전 |
|---|---|---|
| Match 함수/연산자 | MATCH 함수 또는 match 연산자(:)로 기본적인 텍스트 검색을 수행합니다 |
8.17 |
| Query string 함수 | Query String 구문과 QSTR로 복잡한 쿼리를 실행합니다 |
8.17 |
| 관련성 점수 | METADATA _score로 관련성을 계산하고 정렬합니다 |
8.18/9.0 |
| 시맨틱 검색 | semantic_text 필드 타입에 시맨틱 검색을 수행합니다 |
8.18/9.0 |
| 하이브리드 검색 | 어휘 검색과 시맨틱 검색 방식을 사용자 지정 가중치로 결합합니다 | 8.18/9.0 |
| Kibana Query Language | KQL 함수로 Kibana Query Language를 사용합니다 |
8.18/9.0 |
| Match phrase 함수 | MATCH_PHRASE 함수로 구문 매칭을 수행합니다 |
8.19/9.1 |
| FORK 명령 | 동일한 입력 데이터를 처리하는 여러 실행 분기를 만듭니다 | 8.19/9.1 |
| FUSE 명령 | 하이브리드 검색을 위해 여러 쿼리의 결과를 결합하고 점수를 매깁니다 | 9.2 |
| KNN 함수 | 인덱싱된 필드에 근사 검색을 수행해 가장 가까운 k개의 벡터를 찾습니다 | 9.2 |
| RERANK 명령 | 추론 모델을 사용해 검색 결과에 다시 점수를 매겨 관련성을 높입니다 | 9.2 |
| COMPLETION 명령 | LLM을 호출해 임의의 텍스트 생성 작업을 수행합니다 | 9.2 |
| TEXT_EMBEDDING 함수 | 추론 엔드포인트를 사용해 밀집 벡터 임베딩을 생성합니다 | 9.3 |
| DECAY 함수 | 필드 값과 기준 원점 사이의 거리에 따라 감쇠하는 관련성 점수를 계산합니다 | 9.3 |
| SCORE 함수 | 전문 검색 함수를 사용해 표현식에 점수를 매깁니다. 결과로 나온 모든 문서의 점수를 반환합니다 | 9.3 |
| TOP_SNIPPETS 함수 | 텍스트 필드에서 주어진 쿼리 문자열에 가장 적합한 스니펫을 추출합니다 | 9.3 |
| MMR 명령 | Maximum Marginal Relevance 다양화로 결과의 중복을 줄입니다 | 9.4 (preview) |
| EMBEDDING 함수 | 추론 엔드포인트를 사용해 멀티모달 입력에서 밀집 벡터 임베딩을 생성합니다 | 9.5 (preview) |
| 표현식에 대한 MATCH | MATCH로 계산된 컬럼과 인덱싱되지 않은 값을 검색합니다 |
9.5 (preview) |
ES|QL은 문서를 찾는 두 가지 방식, 즉 필터링과 검색을 제공합니다. 효과적인 쿼리를 작성하고 활용 사례에 맞는 방식을 선택하려면 그 차이를 이해하는 것이 중요합니다.
필터링은 조건을 충족하지 않는 문서를 제거합니다. 문서가 조건에 맞는지 아닌지를 판단하는 이분법적 결정입니다. 필터링은 관련성 점수를 계산하지 않고 정확한 일치, 범위, 불리언 논리에 효율적인 인덱스 구조를 활용하므로 더 빠릅니다.
검색은 문서를 필터링하는 동시에 관련성에 따라 순위를 매깁니다. 콘텐츠가 쿼리와 얼마나 잘 일치하는지에 따라 일치하는 각 문서의 점수를 계산하므로, 관련성이 높은 순부터 낮은 순으로 결과를 정렬할 수 있습니다. 검색 함수는 어간 추출, 동의어, 퍼지 매칭 등 고급 텍스트 분석을 사용합니다.
필터링을 선택해야 할 때:
- 정확한 카테고리 일치(
category.keyword == "Electronics") - 날짜 범위(
date >= "2023-01-01") - 수치 비교(
price < 100) - 순위 없이 일치하는 모든 결과가 필요한 모든 경우
검색을 선택해야 할 때:
ES|QL의 검색 함수는 텍스트 필터링에 존재하던 몇 가지 주요 한계를 해결합니다. 다중값 필드에서 바로 동작하고, 적절한 텍스트 분석을 위해 분석기를 활용하며, 더 나은 성능을 위해 최적화된 Lucene 인덱스 구조를 사용합니다.
관련성 순으로 정렬된 결과를 얻으려면 METADATA _score로 점수 계산을 명시적으로 요청하고 점수를 기준으로 정렬해야 합니다. 그렇게 하지 않으면 MATCH 같은 검색 함수도 순위 없이 문서를 필터링하기만 합니다.
METADATA _score가 없으면: MATCH, QSTR, KQL 함수를 포함한 모든 연산이 필터링만 수행합니다. 문서는 일치하거나 일치하지 않을 뿐이며 순위가 매겨지지 않습니다.
METADATA _score가 있으면: 검색 함수가 관련성 점수에 반영되는 반면, 필터링 연산(범위 조건, 정확한 일치)은 점수에 영향을 주지 않습니다. 가장 관련성 높은 결과를 먼저 보려면 SORT _score DESC를 명시적으로 사용해야 합니다.
이를 통해 빠른 필터링을 사용할지, 더 느리지만 강력한 관련성 기반 검색을 사용할지를 완전히 제어할 수 있습니다.
다음 함수들은 ES|QL에서 정밀도와 제어 수준이 각기 다른 텍스트 기반 검색 기능을 제공합니다.
ES|QL은 match에 대해 두 가지 구문 옵션을 제공하며, 이는 Query DSL의 match 쿼리 기능을 그대로 구현한 것입니다.
- 기본 파라미터로 간단한 텍스트 매칭을 하려면 간결한 연산자 구문(:)을 사용하세요.
- 분석기, 퍼지 정도 등 파라미터를 지정해 쿼리를 더 세밀하게 제어하려면 MATCH 함수 구문을 사용하세요.
두 구문의 예시는 튜토리얼을 참고하세요.
MATCH는 EVAL이나 STATS로 생성된 컬럼처럼 인덱스에 기반하지 않는 표현식도 검색할 수 있습니다.
값은 역인덱스를 사용하는 대신 행 단위로 스캔되며, 평소의 배치 제약이 적용되지 않습니다.
표현식을 검색할 때는 함수의 이름 있는 파라미터가 지원되지 않으며 MATCH는 _score에 반영되지 않습니다.
지정한 필드에 match_phrase 쿼리를 수행하려면 MATCH_PHRASE 함수를 사용하세요. 이는 Query DSL의 match_phrase 쿼리를 사용하는 것과 같습니다.
개별 단어 매칭이 아니라 정확한 구문 매칭이 필요하면 MATCH_PHRASE를 사용하세요.
QSTR 함수는 Query DSL의 query_string 쿼리와 동일한 기능을 제공합니다. 이를 통해 와일드카드, 불리언 논리, 다중 필드 검색을 활용한 고급 검색 패턴을 사용할 수 있습니다.
자세한 내용은 Query DSL query_string 문서를 참고하세요.
ES|QL 쿼리에서 Kibana Query Language를 사용하려면 KQL 함수를 사용하세요.
다른 Kibana 인터페이스에서 쿼리를 마이그레이션할 때 KQL 함수는 기존 쿼리 구문을 유지해 주므로, 기존 Kibana 쿼리를 다시 작성하지 않고도 ES|QL로 점진적으로 마이그레이션할 수 있습니다.
KNN 함수는 유사도 지표로 측정했을 때 쿼리 벡터에 가장 가까운 k개의 벡터를 찾습니다. 인덱싱된 dense_vector 또는 semantic_text 필드에 근사 검색을 수행합니다.
의미적으로 유사한 문서 찾기나 벡터 임베딩 기반 추천 시스템 구현처럼 벡터 유사도 검색이 필요한 경우 KNN을 사용하세요.
TEXT_EMBEDDING 함수는 지정한 추론 엔드포인트를 사용해 텍스트 입력에서 밀집 벡터 임베딩을 생성합니다.
벡터화된 데이터에 대한 KNN 검색용 쿼리 벡터를 생성하거나 그 밖의 밀집 벡터 기반 작업을 수행하려면 TEXT_EMBEDDING을 사용하세요.
EMBEDDING 함수는 embedding 태스크 타입의 추론 엔드포인트를 사용해 멀티모달 입력(텍스트, 이미지)에서 밀집 벡터 임베딩을 생성합니다.
base64로 인코딩된 이미지처럼 텍스트가 아닌 입력에서 쿼리 벡터를 생성해야 하는 멀티모달 검색 활용 사례에는 EMBEDDING을 사용하세요.
ES|QL은 밀집 벡터 간의 유사도와 거리를 계산하는 함수를 제공합니다.
V_COSINE: 코사인 유사도V_DOT_PRODUCT: 내적V_L1_NORM: 맨해튼 거리V_L2_NORM: 유클리드 거리V_HAMMING: 해밍 거리
이 함수들은 사용자 지정 점수 로직, 저장된 임베딩과 쿼리 벡터 비교, EVAL을 사용한 사용자 지정 리랭킹 파이프라인 구축에 유용합니다.
DECAY 함수는 설정 가능한 감쇠 함수를 사용해, 숫자·공간·날짜 필드 값과 기준 원점 사이의 거리에 따라 감쇠하는 관련성 점수를 계산합니다.
SCORE 함수는 표현식에 점수를 매깁니다. 전문 검색 함수만 점수가 매겨집니다. 결과로 나온 모든 문서의 점수를 반환합니다.
TOP_SNIPPETS 함수는 텍스트 필드에서 주어진 쿼리 문자열에 가장 적합한 스니펫을 추출합니다. text와 semantic_text 같은 text 계열 필드에 사용할 수 있습니다.
시맨틱 검색은 머신러닝 모델을 활용해 텍스트의 의미를 이해함으로써 더 정확하고 맥락을 반영한 검색 결과를 제공합니다.
ES|QL에서는 전문 검색과 동일한 match 구문을 사용해 semantic_text 필드 타입에 시맨틱 검색을 수행할 수 있습니다.
예시는 semantic_text를 사용한 시맨틱 검색을 참고하거나 튜토리얼을 따라 해 보세요.
하이브리드 검색은 어휘 검색과 시맨틱 검색을 사용자 지정 가중치로 결합해 정확한 키워드 매칭과 의미 이해를 모두 활용합니다.
FORK와 FUSE 명령은 함께 동작해 ES|QL에서 하이브리드 검색을 가능하게 합니다.
FORK는 동일한 입력 데이터를 처리하는 여러 실행 분기를 만듭니다. 그다음 FUSE가 RRF(reciprocal rank fusion) 또는 LINEAR(가중 점수 결합) 방식으로 이 분기들의 결과를 결합하고 점수를 매깁니다. 두 명령을 함께 사용하면 어휘 검색과 시맨틱 검색 같은 서로 다른 검색 전략을 병렬로 실행하고 적절한 관련성 점수와 함께 결과를 병합할 수 있습니다.
예시는 semantic_text를 사용한 하이브리드 검색을 참고하거나 튜토리얼을 따라 해 보세요.
COMPLETION 명령은 텍스트 생성 작업을 위해 대규모 언어 모델(LLM)에 프롬프트를 전송합니다.
질의응답, 요약, 번역 등 AI 기반 텍스트 생성에는 COMPLETION을 사용하세요.
추론 모델을 사용해 검색 결과에 다시 점수를 매겨 관련성을 높이려면 RERANK 명령을 사용하세요. ES|QL 방식과 retriever 방식의 비교는 시맨틱 리랭킹을 참고하세요.
MMR 명령은 Maximum Marginal Relevance를 사용해 서로 지나치게 유사한 문서를 제거함으로써 검색 결과의 중복을 줄입니다. 이는 상위 결과의 다양성을 확보하는 데 유용하며, 다양한 맥락이 LLM 출력 품질을 높이는 RAG 워크플로에서 특히 그렇습니다.
- ES|QL로 검색하고 필터링하기: ES|QL의 검색 도구를 시작하기 위한 실습 튜토리얼로, 이 페이지에서 설명한 기능들의 구체적인 예시를 제공합니다
- ES|QL 쿼리 성능 최적화:
LIKE나RLIKE대신 전문 검색 함수를 사용하는 방법을 포함해 빠른 쿼리를 작성하는 기법
- ES|QL, you know for Search: 점수 계산과 시맨틱 검색 소개
- Introducing full text filtering in ES|QL: ES|QL의 텍스트 필터링 기능 개요