Elasticsearch는 여러분의 사용 사례에 가장 적합한 검색 솔루션을 구축하는 데 도움이 되는 새로운 기능으로 가득 차 있습니다. 최신 검색 AI 경험 구축에 관한 실습형 웨비나에서 이러한 기능을 실제로 활용하는 방법을 배워 보세요. 지금 무료 클라우드 체험을 시작하거나, 내 로컬 기기에서 Elastic을 사용해 볼 수 있습니다.
하이브리드 검색은 어휘 검색의 정확성과 속도에 시맨틱 검색의 자연어 기능을 결합한 강력한 검색 방식으로 널리 알려져 있습니다. 그러나 실제로 적용하는 것은 까다로울 수 있으며, 종종 인덱스에 대한 깊은 지식이 필요하고 간단한 구성이 아닌 장황한 쿼리를 구성해야 합니다. 이 블로그에서는 선형 및 RRF 검색기를 위한 다중 필드 쿼리 형식이 어떻게 하이브리드 검색을 더 간단하고 접근하기 쉽게 만들어 일반적인 골칫거리를 없애고 그 모든 기능을 더 쉽게 활용할 수 있게 해주는지 살펴봅니다. 또한 다중 필드 쿼리 형식을 통해 인덱스에 대한 사전 지식 없이도 하이브리드 검색 쿼리를 수행할 수 있는 방법을 검토합니다.
점수 범위 문제

하이브리드 검색이 어려운 주요 이유 중 하나인 다양한 점수 범위를 살펴보기 위해 무대를 설정해 보겠습니다. 우리의 오랜 친구 BM25는 무한한 점수를 만들어냅니다. 즉, BM25는 0에 가까운 점수부터 (이론적으로) 무한대까지 다양한 점수를 생성할 수 있습니다. 반대로 dense_vector 필드에 대한 쿼리는 0과 1 사이의 점수를 생성합니다. 이 문제를 더욱 악화시키는 semantic_text 은 임베딩을 색인하는 데 사용되는 필드 유형을 난독화하므로 색인 및 추론 엔드포인트 구성에 대한 자세한 지식이 없으면 쿼리의 점수 범위를 알기 어려울 수 있습니다. 이는 어휘 검색 결과와 의미 검색 결과를 통합하려고 할 때 문제가 되는데, 의미 검색 결과가 더 관련성이 높더라도 어휘 검색 결과가 의미 검색 결과보다 우선할 수 있기 때문입니다. 이 문제에 대한 일반적인 해결책은 결과를 인터리빙하기 전에 점수를 정규화하는 것입니다. 이를 위한 두 가지 도구, 선형 검색기와 RRF 검색기가 있습니다.

RRF 검색기는 문서 순위를 관련성 측정값으로 사용하고 점수를 버리는 RRF 알고리즘을 적용합니다. 점수는 고려되지 않으므로 점수 범위 불일치는 문제가 되지 않습니다.
리니어 리트리버는 선형 조합을 사용하여 문서의 최종 점수를 결정합니다. 여기에는 문서에 대한 각 구성 요소 쿼리의 점수를 가져와서 정규화한 다음 합산하여 총 점수를 생성하는 작업이 포함됩니다. 수학적으로 이 연산은 다음과 같이 표현할 수 있습니다:
여기서 N 은 정규화 함수이고 SX 는 쿼리 X 의 점수입니다. 정규화 함수는 각 쿼리의 점수를 동일한 범위를 사용하도록 변환하기 때문에 여기서 핵심적인 역할을 합니다. 리니어 리트리버에 대해 자세히 알아보려면 여기를 참조하세요.
분석하기
사용자는 이러한 도구를 사용하여 효과적인 하이브리드 검색을 구현할 수 있지만 색인에 대한 약간의 지식이 필요합니다. 두 개의 필드가 있는 인덱스를 쿼리하는 리니어 리트리버의 예를 살펴보겠습니다:
1. semantic_text_field 는 텍스트 임베딩 모델인 E5를 사용하는 semantic_text 필드입니다.
text_field 는 표준 text 필드입니다.
1. semantic_text 필드에서 match 쿼리를 사용하며, Elasticsearch 8.18/9.0에서 지원이 추가되었습니다.
쿼리를 구성할 때 semantic_text_field 은 텍스트 임베딩 모델을 사용하므로 이 쿼리에 대한 모든 쿼리는 0에서 1 사이의 점수를 생성한다는 점을 염두에 두어야 합니다. 또한 text_field 은 표준 text 필드이므로 이 필드로 쿼리하면 무제한 점수가 생성된다는 점도 알아야 합니다. 적절한 연관성을 가진 결과 집합을 만들려면 쿼리 점수를 결합하기 전에 정규화하는 리트리버를 사용해야 합니다. 이 예에서는 각 쿼리의 점수를 0과 1 사이의 값으로 정규화하는 minmax 정규화와 함께 선형 검색기를 사용합니다.
이 예제의 쿼리 구성은 두 개의 필드만 관련되어 있기 때문에 매우 간단합니다. 그러나 더 많은 필드와 다양한 유형이 추가되면 매우 빠르게 복잡해질 수 있습니다. 이는 효과적인 하이브리드 검색 쿼리를 작성하려면 쿼리 대상 인덱스에 대한 심층적인 지식이 필요한 경우가 많으므로 구성 요소 쿼리 점수를 조합하기 전에 적절하게 정규화해야 한다는 것을 보여줍니다. 이는 하이브리드 검색의 광범위한 채택을 가로막는 장벽이 됩니다.
쿼리 그룹화
예제를 확장해 보겠습니다: 하나의 text 필드와 두 개의 semantic_text 필드를 쿼리하려면 어떻게 해야 할까요? 다음과 같이 쿼리를 작성할 수 있습니다:
겉으로 보기에는 좋아 보이지만 잠재적인 문제가 있습니다. 이제 semantic_text 필드 매치가 전체 점수의 ⅔를 차지합니다:
이는 불균형한 점수를 만들기 때문에 원하지 않을 수도 있습니다. 필드가 3개만 있는 이 예제에서는 그 영향이 눈에 띄지 않을 수 있지만, 더 많은 필드가 쿼리되면 문제가 됩니다. 예를 들어, 대부분의 인덱스에는 시맨틱 필드보다 훨씬 더 많은 어휘 필드가 포함되어 있습니다(예 dense_vector, sparse_vector, 또는 semantic_text). 위의 패턴을 사용하여 어휘 필드 9개와 의미 필드 1개가 있는 인덱스를 쿼리한다면 어떨까요? 어휘 일치 항목이 점수의 90% 을 차지하여 의미론적 검색의 효과를 무색하게 만들었습니다.
이 문제를 해결하는 일반적인 방법은 쿼리를 어휘 및 의미 범주로 그룹화하고 두 범주에 균등하게 가중치를 부여하는 것입니다. 이렇게 하면 어느 한 카테고리가 총점을 지배하는 것을 방지할 수 있습니다.
이를 실천에 옮겨 보겠습니다. 이 예제에서 리니어 리트리버를 사용할 때 그룹화된 쿼리 접근 방식은 어떤 모습일까요?
와, 점점 장황해지네요! 전체 쿼리를 살펴보기 위해 위아래로 여러 번 스크롤해야 했을 수도 있습니다! 여기서는 두 가지 수준의 정규화를 사용하여 쿼리 그룹을 생성합니다. 수학적으로는 다음과 같이 표현할 수 있습니다:
이 두 번째 정규화 수준은 semantic_text 필드와 text 필드에 대한 쿼리의 가중치가 균등하게 적용되도록 합니다. 이 예제에서는 어휘 필드가 하나뿐이므로 text_field 에 대한 두 번째 수준 정규화를 생략하여 더 자세한 설명을 생략했습니다.
이 쿼리 구조는 이미 다루기 힘든데다 세 개의 필드만 쿼리하고 있습니다. 더 많은 필드를 쿼리할수록 숙련된 검색 실무자라도 관리하기가 점점 더 어려워집니다.
다중 필드 쿼리 형식

이 모든 것을 간소화하기 위해 Elasticsearch 8.19, 9.1 및 서버리스에서 선형 및 RRF 검색기에 대한 다중 필드 쿼리 형식을 추가했습니다. 이제 위와 동일한 쿼리를 수행할 수 있습니다:
쿼리가 55줄에서 단 9줄로 줄어듭니다! Elasticsearch는 인덱스 매핑을 자동으로 사용합니다:
- 쿼리되는 각 필드의 유형을 결정합니다.
- 각 필드를 어휘 또는 의미론적 범주로 그룹화합니다.
- 최종 점수에서 각 카테고리에 균등하게 가중치를 부여합니다.
이를 통해 누구나 인덱스나 사용된 추론 엔드포인트에 대한 세부 정보를 몰라도 효과적인 하이브리드 검색 쿼리를 실행할 수 있습니다.
RRF를 사용하는 경우 순위가 관련성의 프록시로 사용되므로 normalizer 을 생략할 수 있습니다:
필드별 부스팅
리니어 리트리버를 사용할 때 필드별 부스트를 적용하여 특정 필드에서 경기의 중요도를 조정할 수 있습니다. 예를 들어 semantic_text 필드 2개와 text 필드 2개 등 4개의 필드를 쿼리한다고 가정해 보겠습니다:
기본적으로 각 필드는 해당 그룹(어휘 또는 의미)에서 동일하게 가중치가 부여됩니다. 점수 분석은 다음과 같습니다:

즉, 각 필드는 총 점수의 25% %입니다.
field^boost 구문을 사용하여 모든 필드에 필드별 부스트를 추가할 수 있습니다. semantic_text_field_1 와 text_field_1 에 2의 부스트를 적용해 보겠습니다:
이제 점수 분석은 다음과 같습니다:

각 쿼리 그룹은 여전히 동일하게 가중치가 적용되지만 이제 그룹 내 필드 가중치가 변경되었습니다:
semantic_text_field_1시맨틱 쿼리 그룹 점수는 66%, 총 점수는 33% 입니다.text_field_1는 어휘 쿼리 그룹 점수 66%, 총 점수 33% 입니다.
| ℹ️ 필드별 부스트가 적용되어도 총 점수 범위는 변경되지 않습니다. 이는 점수 정규화의 의도된 부작용으로, 어휘 및 의미론적 쿼리 점수가 서로 직접 비교 가능한 상태로 유지되도록 합니다. |
|---|
| ℹ️ 필드별 부스팅은 Elasticsearch 9.2+의 RRF 리트리버와 함께 사용할 수도 있습니다. |
와일드카드 해상도
fields 매개변수에 * 와일드카드를 사용하여 여러 필드를 일치시킬 수 있습니다. 위의 예를 계속 이어서, 이 쿼리는 기능적으로emantic_text_field_1, semantic_text_field_2, text_field_1 을 명시적으로 쿼리하는 것과 동일합니다:
*_field_1 패턴이 text_field_1 및 semantic_text_field_1 와 모두 일치한다는 점이 흥미롭습니다. 이는 자동으로 처리되며, 각 필드가 명시적으로 쿼리된 것처럼 쿼리가 실행됩니다. semantic_text_field_1 이 두 패턴과 모두 일치해도 괜찮습니다. 모든 필드 이름 일치 항목은 쿼리 실행 전에 중복이 제거됩니다.
와일드카드는 다양한 방법으로 사용할 수 있습니다:
- 접두사 일치(예:
*_text_field) - 인라인 매칭(예:
semantic_*_field) - 접미사 일치(예:
semantic_text_field_*)
*_text_field_* 와 같이 여러 와일드카드를 사용하여 위의 조합을 적용할 수도 있습니다.
기본 쿼리 필드
다중 필드 쿼리 형식을 사용하면 전혀 모르는 인덱스를 쿼리할 수도 있습니다. fields 매개변수를 생략하면 index.query.default_field 인덱스 설정으로 지정된 모든 필드를 쿼리합니다:
기본적으로 index.query.default_field 은 * 으로 설정되어 있습니다. 이 와일드카드는 용어 쿼리를 지원하는 인덱스의 모든 필드 유형(대부분)으로 확인합니다. 예외는 있습니다:
dense_vector필드rank_vector필드- 지오메트리 필드:
geo_point,shape
이 기능은 타사에서 제공하는 색인에 대해 하이브리드 검색 쿼리를 수행하려는 경우에 특히 유용합니다. 다중 필드 쿼리 형식을 사용하면 간단한 방법으로 적절한 쿼리를 실행할 수 있습니다. fields 매개변수만 제외하면 해당되는 모든 필드가 쿼리됩니다.
결론
점수 범위 문제로 인해 효과적인 하이브리드 검색을 구현하기가 어려울 수 있으며, 특히 쿼리되는 인덱스나 사용 중인 추론 엔드포인트에 대한 인사이트가 제한적인 경우 더욱 그렇습니다. 선형 및 RRF 검색기를 위한 다중 필드 쿼리 형식은 자동화된 쿼리 그룹화 기반의 하이브리드 검색 방식을 간단하고 접근하기 쉬운 API로 패키징하여 이러한 어려움을 덜어줍니다. 필드별 부스팅, 와일드카드 해상도 및 기본 쿼리 필드와 같은 추가 기능을 통해 다양한 사용 사례를 포괄하는 기능을 확장할 수 있습니다.
지금 바로 다중 필드 쿼리 형식을 사용해 보세요.
무료 체험 판으로 완전 관리형 Elasticsearch 서버리스 프로젝트에서 다중 필드 쿼리 형식의 선형 및 RRF 검색기를 확인해 보세요. 8.19 & 9.1부터 스택 버전으로도 사용할 수 있습니다.
명령 한 번으로 로컬 환경에서 몇 분 안에 시작할 수 있습니다:




