Azure AI 검색의 성능 향상을 위한 팁

이 문서는 쿼리 및 인덱싱 성능을 높이기 위한 팁과 모범 사례 모음입니다. 검색 성능에 가장 큰 영향을 줄 수 있는 요소를 알면 비효율성을 방지하고 검색 서비스를 최대한 활용하는 데 도움이 될 수 있습니다. 몇 가지 주요 요소는 다음과 같습니다.

  • 인덱스 구성(스키마 및 크기)
  • 쿼리 디자인
  • 서비스 용량(계층, 복제본 수 및 파티션 수)

참고 항목

대량 인덱싱 전략을 찾고 계신가요? Azure AI 검색에서 대용량 데이터 세트 인덱싱을 참조하세요.

인덱스 크기 및 스키마

쿼리는 더 작은 인덱스에서 더 빨리 실행됩니다. 이는 부분적으로 검사할 필드가 더 적은 기능이지만, 시스템에서 이후 쿼리를 위해 콘텐츠를 캐시하는 방식으로 인해 발생할 수 있습니다. 첫 번째 쿼리 후에도 일부 콘텐츠는 더 효율적으로 검색되는 메모리에 남아 있습니다. 인덱스 크기는 시간이 지남에 따라 증가하는 경향이 있으므로 한 가지 모범 사례는 스키마와 문서 모두에서 인덱스 구성을 정기적으로 다시 방문하여 콘텐츠를 줄일 수 있는 기회를 찾는 것입니다. 그러나 인덱스가 적절한 크기인 경우 복제본을 추가하거나 서비스 계층을 업그레이드하여 용량을 늘리는 것만이 유일하게 보정할 수 있는 방법입니다. "팁: 표준 S2 계층으로 업그레이드" 섹션에서는 수직 스케일 업과 수평 스케일 아웃 결정에 대해 설명합니다.

스키마 복잡성은 인덱싱 및 쿼리 성능에 부정적인 영향을 미칠 수도 있습니다. 과도한 필드 특성은 제한 사항 및 처리 요구 사항을 기반으로 합니다. 복합 형식은 인덱싱하고 쿼리하는 데 더 오래 걸립니다. 다음 몇 가지 섹션에서는 각 조건에 대해 살펴봅니다.

팁: 선택적 필드 특성 사용

검색 인덱스를 만들 때 관리자 및 개발자가 범하는 일반적인 실수는 필요한 속성만 선택하는 것 아니라 필드에 사용할 수 있는 모든 속성을 선택하는 것입니다. 예를 들어 필드가 전체 텍스트 검색 가능일 필요가 없는 경우 검색 가능 특성을 설정할 때 해당 필드를 건너뜁니다.

선택적 특성

필터, 패싯 및 정렬 지원을 사용하는 경우 스토리지 요구 사항을 4배로 늘릴 수 있습니다. 제안기를 추가하면 스토리지 요구 사항이 더 늘어납니다. 특성이 스토리지에 미치는 영향에 대한 설명은 특성 및 인덱스 크기를 참조하세요.

요약하면 과도한 특성의 결과는 다음과 같습니다.

  • 필드의 콘텐츠를 처리하고 검색 반전 인덱스 내에 저장하는 데 필요한 추가 작업(검색 가능한 콘텐츠가 포함된 필드에만 "검색 가능" 특성 설정)으로 인해 인덱싱 성능이 저하됩니다.

  • 각 쿼리에서 처리해야 하는 더 큰 표면을 만듭니다. 검색 가능으로 표시된 모든 필드는 전체 텍스트 검색에서 검사됩니다.

  • 추가 스토리지로 인해 운영 비용이 증가합니다. 필터링 및 정렬에는 분석되지 않은 원래 문자열을 저장하기 위한 추가 공간이 필요합니다. 필요하지 않은 필드에는 필터링 가능 또는 정렬 가능 특성을 설정하지 마세요.

  • 대부분의 경우 과도한 특성으로 인해 필드 기능이 제한됩니다. 예를 들어 패싯 가능, 필터링 가능 및 검색 가능 필드인 경우 필드 내에 16KB의 텍스트만 저장할 수 있지만, 검색 가능한 필드는 최대 16MB의 텍스트를 저장할 수 있습니다.

참고 항목

불필요한 특성만 피해야 합니다. 필터와 패싯은 검색 환경에 필수적인 경우가 많으며, 필터가 사용되면 결과를 정렬할 수 있도록 정렬이 필요한 경우가 많습니다(필터 자체는 정렬되지 않은 집합으로 반환됨).

팁: 복합 형식에 대한 대안 고려

복합 데이터 형식은 JSON 문서에 있는 부모-자식 요소와 같이 데이터에 복잡한 중첩 구조가 있는 경우에 유용합니다. 복합 형식의 단점은 복잡하지 않은 데이터 형식에 비해 콘텐츠를 인덱싱하는 데 필요한 추가 스토리지 요구 사항 및 추가 리소스가 있다는 것입니다.

경우에 따라 복합 데이터 구조를 컬렉션과 같은 더 단순한 필드 형식에 매핑하여 이러한 단점을 방지할 수 있습니다. 또는 필드 계층 구조를 개별 루트 수준 필드로 평면화하도록 선택할 수 있습니다.

평면화된 필드 구조

쿼리 디자인

쿼리 구성 및 복잡성은 성능에 가장 중요한 요소 중 하나이며 쿼리 최적화는 성능을 크게 개선시킬 수 있습니다. 쿼리를 설계할 때 다음 사항을 고려합니다.

  • 검색 가능한 필드 수. 검색 가능한 필드가 추가될 때마다 검색 서비스에 더 많은 작업이 필요합니다. "searchFields" 매개 변수를 사용하여 쿼리 시 검색되는 필드를 제한할 수 있습니다. 성능 향상을 위해 관심 있는 필드만 지정하는 것이 가장 좋습니다.

  • 반환되는 데이터 양. 많은 양의 콘텐츠를 검색하면 쿼리 속도가 느려질 수 있습니다. 쿼리를 구조화할 때 결과 페이지를 렌더링하는 데 필요한 필드만 반환한 다음, 사용자가 일치 항목을 선택하면 조회 API를 사용하여 나머지 필드를 검색합니다.

  • 부분 용어 검색 사용.부분 용어 검색(예: 접두사 검사, 유사 항목 검사 및 정규식 검사)은 결과를 생성하기 위해 전체 인덱스 검색을 수행해야 하므로 일반적인 키워드 검색보다 계산 비용이 더 많이 듭니다.

  • 패싯 수. 패싯을 쿼리에 추가하려면 각 쿼리에 대한 집계가 필요합니다. 패싯에 대해 더 많은 “개수”를 요청하면 서비스에서 추가 작업을 해야 합니다. 일반적으로 앱에서 렌더링하려는 패싯만 추가하고 필요한 경우가 아니면 패싯에 대해 높은 수를 요청하지 않도록 합니다.

  • 큰 skip 값. $skip 매개 변수를 큰 값(예: 천 단위)으로 설정하면 엔진에서 각 요청에 대해 더 큰 문서를 검색하고 순위를 지정하기 때문에 검색 대기 시간이 증가합니다. 성능상의 이유로, 큰 $skip 값을 피하고 필터링과 같은 다른 기술을 사용하여 많은 수의 문서를 검색하는 것이 가장 좋습니다.

  • 높은 카디널리티 필드 제한. 높은 카디널리티 필드는 상당히 많은 수의 고유 값이 있는 패싯 가능 또는 필터링 가능한 필드를 나타내며, 결과적으로 결과를 계산할 때 상당한 리소스를 소비합니다. 예를 들어 제품 ID 또는 설명 필드를 패싯 가능 및 필터링 가능으로 설정하면 문서 간에 대부분의 값이 고유하므로 높은 카디널리티 필드로 간주됩니다.

팁 : 필터 조건을 오버로드하는 대신 검색 함수 사용

쿼리가 점점 더 복잡한 필터 조건을 사용함에 따라 검색 쿼리의 성능이 저하됩니다. 사용자 ID를 기준으로 결과를 자르는 필터를 사용하는 방법을 보여 주는 다음 예제를 살펴봅니다.

$filter= userid eq 123 or userid eq 234 or userid eq 345 or userid eq 456 or userid eq 567

이 경우 필터 식을 사용하여 각 문서의 단일 필드가 가능한 사용자 ID의 많은 값 중 하나인지 확인합니다. 보안 조정(쿼리를 실행하는 사용자를 나타내는 보안 주체 ID 목록에 대해 하나 이상의 보안 주체 ID가 포함된 필드 확인)을 구현하는 애플리케이션에서 이 패턴을 찾을 가능성이 가장 높습니다.

많은 수의 값이 포함된 필터를 더 효율적으로 실행하는 방법은 다음 예제와 같이 search.in 함수를 사용하는 것입니다.

search.in(userid, '123,234,345,456,567', ',')

팁 : 느린 개별 쿼리에 대한 파티션 추가

일반적으로 쿼리 성능이 저하되는 경우 복제본을 추가하면 문제가 해결되는 경우가 많습니다. 그러나 완료하는 데 너무 오래 걸리는 단일 쿼리 문제인 경우 어떻게 할까요? 이 시나리오에서 복제본을 추가하는 것은 도움이 되지 않지만 더 많은 파티션이 도움이 될 수 있습니다. 파티션은 데이터를 추가 컴퓨팅 리소스로 분할합니다. 두 개의 파티션은 데이터를 절반으로, 세 번째 파티션은 1/3로 분할하는 식입니다.

파티션을 추가할 때의 한 가지 긍정적인 부작용은 병렬 컴퓨팅으로 인해 느린 쿼리가 더 빠르게 수행된다는 것입니다. 많은 문서와 일치하는 쿼리 또는 많은 수의 문서에 대한 개수를 제공하는 패싯과 같이, 선택 수준이 낮은 쿼리를 병렬화했습니다. 문서의 관련성을 채점하거나 문서를 계수하는 데 상당한 계산이 필요하므로 파티션을 추가하면 쿼리를 더 빨리 완료할 수 있습니다.

파티션을 추가하려면 Azure Portal, PowerShell, Azure CLI 또는 관리 SDK를 사용합니다.

서비스 용량

쿼리가 너무 오래 걸리거나 서비스에서 요청을 삭제하기 시작하면 서비스에 과부하가 걸립니다. 이 경우 서비스를 업그레이드하거나 용량을 추가하여 문제를 해결할 수 있습니다.

검색 서비스의 계층과 복제본/파티션 수도 성능에 큰 영향을 줍니다. 점진적으로 더 높은 각 계층은 더 빠른 CPU와 더 많은 메모리를 제공하며 둘 다 성능에 긍정적인 영향을 미칩니다.

팁: 새 대용량 검색 서비스 만들기

[지원되는 지역](2024년 4월 3일 이후 지원되는 지역)에서 만든 기본 및 표준 서비스에는 기존 서비스에 비해 파티션당 스토리지가 더 들어 있습니다. 더 높은 계층 및 더 높은 청구 가능 요금으로 업그레이드하기 전에 계층 서비스 제한을 다시 검토하여 같은 계층이 최신 서비스에서 필요한 스토리지를 제공하는지 확인합니다.

팁: 표준 S2 계층으로 업그레이드

표준 S1 검색 계층은 고객이 시작하는 경우가 많습니다. S1 서비스의 일반적인 패턴은 시간이 지남에 따라 인덱스가 증가하며, 이에 따라 파티션이 더 많이 필요합니다. 파티션이 많을수록 응답 시간이 느려지므로 쿼리 로드를 처리하기 위해 더 많은 복제본이 추가됩니다. 짐작할 수 있듯이 S1 서비스를 실행하는 데 드는 비용은 이제 초기 구성 이상의 수준으로 진행되었습니다.

이 분기 시점에서 중요 한 질문은 현재 서비스의 파티션 또는 복제본 수를 점진적으로 늘리는 대신 상위 계층으로 이동하는 것이 유용한지 여부입니다.

용량 수준이 증가한 서비스의 예로 다음 토폴로지를 생각해 보세요.

  • 표준 S1 계층
  • 인덱스 크기: 190GB
  • 파티션 수: 8개(S1에서 파티션 크기는 파티션당 25GB)
  • 복제본 수: 2개
  • 총 검색 단위 수: 16개(8개 파티션 x 2개 복제본)
  • 가상 소매 가격: $4,000 USD 이하/월(250 USD x 16개 검색 단위 가정)

서비스 관리자가 여전히 더 높은 대기 시간 비율을 확인하여 다른 복제본을 추가하는 것을 고려하고 있다고 가정합니다. 이렇게 하면 복제본 수가 2에서 3으로 변경되고, 이에 따라 검색 단위 수가 24로 변경되며, 결과적으로 $6,000 USD/월의 가격이 됩니다.

그러나 관리자가 표준 S2 계층으로 이동하도록 선택한 경우 토폴로지는 다음과 같습니다.

  • 표준 S2 계층
  • 인덱스 크기: 190GB
  • 파티션 수: 2개(S2에서 파티션 크기는 파티션당 100GB)
  • 복제본 수: 2개
  • 총 검색 단위 수: 4개(2개 파티션 x 2개 복제본)
  • 가상 소매 가격: $4,000 USD 이하/월(1,000 USD x 4개 검색 단위 가정)

이 가상 시나리오에서 설명한 대로 처음에 더 높은 계층을 선택한 것처럼 비슷한 비용이 발생하는 더 낮은 계층의 구성을 사용할 수 있습니다. 그러나 더 높은 계층에는 고급 스토리지가 제공되므로 인덱싱 속도가 빨라집니다. 또한 더 높은 계층에는 추가 메모리뿐만 아니라 훨씬 더 많은 컴퓨팅 성능도 있습니다. 동일한 비용으로 동일한 인덱스를 지원하는 더 강력한 인프라를 사용할 수 있습니다.

추가된 메모리의 중요한 이점은 더 많은 인덱스를 캐시할 수 있으므로 검색 대기 시간이 단축되고 초당 쿼리 수가 늘어난다는 것입니다. 이 추가 기능을 사용하는 경우 관리자는 복제본 수를 늘릴 필요도 없고, 잠재적으로 S1 서비스를 유지하는 것보다 더 적은 비용을 지불할 수 있습니다.

팁: 정규식 쿼리에 대한 대안 고려

정규식 쿼리 또는 정규식은 특히 비용이 많이 들 수 있습니다. 이렇게 하면 고급 검색에 매우 유용할 수 있지만 실행에 많은 처리 능력이 필요할 수 있으며, 정규식이 복잡하거나 많은 양의 데이터를 검색하는 경우 특히 그렇습니다. 이러한 모든 요소는 검색 대기 시간을 높이는 데 영향을 줍니다. 이러한 상황을 완화하려면 정규식을 단순화하거나 복잡한 쿼리를 더 작고 관리하기 쉬운 쿼리로 분할합니다.

다음 단계

서비스 성능과 관련된 다른 문서를 검토합니다.