다음을 통해 공유


검색 결과에 패싯 탐색 추가

패싯 탐색은 애플리케이션이 문서 그룹(예: 범주 또는 브랜드)에 대한 검색 범위를 지정하기 위한 양식 컨트롤을 제공하는 검색 앱에서 쿼리 결과에 대한 자체 방향 필터링에 사용되며, Azure AI Search는 환경을 뒷받침하기 위한 데이터 구조와 필터를 제공합니다.

이 문서에서는 Azure AI Search에서 패싯 탐색 구조를 반환하는 단계를 알아봅니다. 기본 개념 및 클라이언트에 익숙해지면, 기본 패싯과 고유한 수를 포함한 다양한 사용 사례에 대한 구문을 이해하기 위해 패싯 예제로 계속 진행하십시오.

미리 보기 API를 통해 더 많은 패싯 기능을 사용할 수 있습니다.

  • 계층적 패싯 구조체
  • 패싯 필터링
  • 패싯 집계

패싯 탐색 예제는 미리 보기 기능에 대한 구문 및 사용을 제공합니다.

검색 페이지의 범주형 탐색

패싯은 각 특정 쿼리 결과 집합을 기반으로 하므로 동적입니다. 검색 응답은 결과에서 문서를 탐색하는 데 사용되는 모든 패싯 버킷을 제공합니다. 쿼리를 먼저 실행한 다음, 현재 결과에서 패싯을 끌어와 패싯 탐색 구조로 어셈블합니다.

Azure AI Search에서 패싯은 한 계층 깊이이며 미리 보기 API를 사용하지 않는 한 계층적일 수 없습니다. 패싯 탐색 구조에 익숙하지 않은 경우 다음 예제에서 왼쪽에 있는 항목을 참조하세요. 개수는 각 패싯의 일치 항목 수를 나타냅니다. 동일한 문서가 여러 패싯으로 나타날 수 있습니다.

패싯 검색 결과의 스크린샷.

패싯을 사용하면 원하는 항목을 쉽게 찾을 수 있으며 항상 결과를 얻을 수 있습니다. 개발자는 패싯을 통해 검색 인덱스를 탐색하는 데 가장 유용한 검색 조건을 노출할 수 있습니다.

코드에서 다각적 탐색

패싯은 인덱스에서 지원되는 필드에서 활성화된 후 쿼리에 지정됩니다. 패싯 탐색 구조는 응답의 시작 부분에 반환되고 그 다음에 결과가 반환됩니다.

다음 REST 예제는 전체 인덱스로 범위가 지정된 빈 쿼리("search": "*")입니다( 기본 제공 호텔 샘플 참조). 매개 변수는 facets "범주" 필드를 지정합니다.

POST https://{{service_name}}.search.windows.net/indexes/hotels/docs/search?api-version={{api_version}}
{
    "search": "*",
    "queryType": "simple",
    "select": "",
    "searchFields": "",
    "filter": "",
    "facets": [ "Category"], 
    "orderby": "",
    "count": true
}

예제에 대한 응답은 계층적 탐색 구조로 시작합니다. 구조는 "Category" 값과 각각의 호텔 수로 구성됩니다. 그 뒤에는 나머지 검색 결과가 이어지며, 간결함을 위해 여기서는 하나의 문서로 축소되었습니다. 이 예제는 여러 가지 이유로 잘 작동합니다. 이 필드의 패싯 수는 한도(기본값: 10) 이내이므로 모두 표시되고 50개 호텔 인덱스의 모든 호텔이 정확히 이러한 범주 중 하나로 표시됩니다.

{
    "@odata.context": "https://demo-search-svc.search.windows.net/indexes('hotels')/$metadata#docs(*)",
    "@odata.count": 50,
    "@search.facets": {
        "Category": [
            {
                "count": 13,
                "value": "Budget"
            },
            {
                "count": 12,
                "value": "Resort and Spa"
            },
            {
                "count": 9,
                "value": "Luxury"
            },
            {
                "count": 7,
                "value": "Boutique"
            },
            {
                "count": 5,
                "value": "Suite"
            },
            {
                "count": 4,
                "value": "Extended-Stay"
            }
        ]
    },
    "value": [
        {
            "@search.score": 1.0,
            "HotelId": "1",
            "HotelName": "Stay-Kay City Hotel",
            "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
            "Category": "Boutique",
            "Tags": [
                "pool",
                "air conditioning",
                "concierge"
            ],
            "ParkingIncluded": false,
        },
        . . . 
    ]
}

필드에 패싯 사용

일반 텍스트 또는 숫자 콘텐츠를 포함하는 새 필드에 패싯을 추가할 수 있습니다. 지원되는 데이터 형식에는 문자열, 날짜, 부울 필드 및 숫자 필드(벡터가 아님)가 포함됩니다.

Azure PORTAL, REST API, Azure SDK 또는 Azure AI Search에서 인덱스 스키마를 만들거나 업데이트하는 방법을 사용할 수 있습니다. 첫 번째 단계로 패싯에 사용할 필드를 식별합니다.

특성을 지정할 필드 선택

패싯은 단일 값 필드 및 컬렉션에 대해 계산될 수 있습니다. 패싯 탐색에서 가장 잘 작동하는 필드에는 다음과 같은 특성이 있습니다.

  • 사람이 읽을 수 있는(비벡터) 콘텐츠입니다.
  • 낮은 카디널리티(검색 모음의 문서 전체에서 반복되는 몇 가지 고유 값).
  • 탐색 트리에서 멋지게 렌더링되는 짧은 설명 값(하나 또는 두 단어)입니다.

필드 이름 자체가 아닌 필드 내의 값은 패싯 탐색 구조에서 패싯을 생성합니다. 패싯이 Color라는 문자열 필드인 경우 패싯은 파란색, 녹색 및 해당 필드의 다른 모든 값이 됩니다. 필드 값을 검토하여 오타, null 또는 대/소문자 차이가 없는지 확인합니다. 텍스트의 사소한 변형을 부드럽게 하려면 필터링 가능 및 패싯 가능 필드에 표준 변환기를 할당 하는 것이 좋습니다. 예를 들어 "Canada", "CANADA" 및 "canada"는 모두 하나의 버킷으로 정규화됩니다.

지원되지 않는 필드 방지

기존 필드, 벡터 필드 또는 Edm.GeographyPointCollection(Edm.GeographyPoint) 형식의 필드에서 패싯을 설정할 수 없습니다.

복합 필드 컬렉션에서 "facetable"은 null이어야 합니다.

새 필드 정의로 시작

필드를 만들 때만 필드를 인덱싱하는 방법에 영향을 주는 특성을 설정할 수 있습니다. 이 제한은 패싯 및 필터에 적용됩니다.

인덱스가 이미 있는 경우 패싯을 제공하는 새 필드 정의를 추가할 수 있습니다. 인덱스 내의 기존 문서는 새 필드에 대한 null 값을 가져옵니다. 이 null 값은 다음에 인덱스 새로 고칠 때 대체됩니다.

  1. Azure Portal의 검색 서비스 페이지에서 인덱스의 필드 탭으로 이동하여 필드 추가를 선택합니다.

  2. 이름, 데이터 형식 및 특성을 제공합니다. 응답에서 패싯 버킷을 기반으로 필터를 설정하는 것이 일반적이므로 필터링 가능한 항목을 추가하는 것이 좋습니다. 필터가 무질서한 결과를 반환하기 때문에 애플리케이션에서 정렬할 수 있도록 정렬 가능한 것을 권장합니다.

    또한 필드에서 전체 텍스트 검색을 지원하려는 경우 검색 가능을 설정하고 검색 응답에 필드를 포함하려는 경우 검색 가능을 설정할 수 있습니다.

    Azure Portal의 필드 추가 페이지 스크린샷.

  3. 필드 정의를 저장합니다.

쿼리에서 특정한 속성 반환

패싯은 쿼리 응답의 결과에서 동적으로 계산됩니다. 현재 쿼리에서 찾은 문서에 대한 패싯만 가져옵니다.

검색 탐색기에서 JSON 보기를 사용하여 Azure Portal에서 패싯 매개 변수를 설정합니다.

  1. 인덱스 선택 및 JSON 보기에서 검색 탐색기를 엽니다.
  2. JSON에서 쿼리를 제공합니다. 이를 입력하거나 REST 예제에서 JSON을 복사하거나 intellisense를 사용하여 구문에 도움을 줄 수 있습니다. 패싯 식에 대한 참조는 다음 탭의 REST 예제를 참조하세요.
  3. 검색을 선택하여 JSON으로 표현된 패싯 결과를 반환합니다.

다음은 호텔 샘플 인덱스의 기본 패싯 쿼리 예제 스크린샷입니다. 이 문서의 다른 예제에 붙여넣어 검색 탐색기에서 결과를 반환할 수 있습니다.

Azure Portal의 검색 탐색기 페이지 스크린샷.

패싯 작업에 대한 모범 사례

이 섹션은 애플리케이션 개발에 도움이 되는 팁과 해결 방법의 모음입니다.

C#: 웹 앱에 검색 추가하기를 추천합니다. 이는 프레젠테이션 계층의 코드를 포함한 패싯 탐색의 예제입니다. 샘플에는 필터, 제안 및 자동 완성도 포함되어 있습니다. 프레젠테이션 계층에 JavaScript 및 React를 사용합니다.

정규화되지 않거나 빈 검색 문자열을 사용하여 패싯 탐색 구조 초기화

열린 쿼리("search": "*")를 사용하여 검색 페이지를 초기화하여 계층적 탐색 구조를 완전히 채우는 것이 유용합니다. 요청에 쿼리 용어를 전달하는 즉시 패싯 탐색 구조의 범위가 전체 인덱스가 아닌 결과의 일치 항목으로 지정됩니다. 이 방법은 테스트 중에 패싯 및 필터 동작을 확인하는 데 유용합니다. 쿼리에 일치 조건을 포함하면 일치하지 않는 문서가 응답에서 제외되며, 이는 패싯의 배제를 포함할 수 있는 잠재적인 후속 효과를 초래할 수 있습니다.

패싯 지우기

사용자 환경을 디자인할 때 패싯을 지우기 위한 메커니즘을 추가해야 합니다. 패싯을 지우는 일반적인 방법은 페이지를 다시 설정하기 위해 열린 쿼리를 실행하는 것입니다.

패싯을 사용하지 않도록 설정하여 스토리지에 저장하고 성능 향상

성능 및 스토리지 최적화의 경우 패싯으로 사용해서는 안 되는 필드에 대해 설정합니다 "facetable": false . 예를 들어 ID나 제품 이름과 같은 고유 값에 대해 문자열 필드를 사용하여 패싯 탐색에서의 실수로 인한 비효율적인 사용을 방지할 수 있습니다. 이 모범 사례는 기본적으로 문자열 필드에서 필터 및 패싯을 사용하도록 설정하는 REST API에 특히 중요합니다.

Edm.GeographyPoint 또는 Collection(Edm.GeographyPoint) 필드를 패싯 탐색에서 사용할 수 없습니다. 패싯은 카디널리티가 낮은 필드에서 가장 잘 작동한다는 점을 기억하세요. 지역 좌표가 확인되는 방식 때문에 지정된 데이터 세트에서 두 좌표 집합이 같은 경우는 드뭅니다. 따라서 지리적 좌표에는 패싯이 지원되지 않습니다. 도시 또는 지역 필드를 사용하여 위치별로 패싯해야 합니다.

잘못된 데이터 확인

인덱싱을 위해 데이터를 준비할 때 null 값, 맞춤법 오류 또는 대/소문자 불일치, 동일한 단어의 단일 및 복수 버전에 대한 필드를 확인합니다. 기본적으로 필터와 패싯은 어휘 분석이나 맞춤법 검사를 거치지 않습니다. 즉, 단어의 한 문자가 다르더라도 "facetable" 필드의 모든 값이 잠재적인 패싯입니다.

노멀라이저는 데이터 불일치를 완화하여 대/소문자 및 문자 차이를 수정할 수 있습니다. 그렇지 않은 경우 데이터를 검사하려면 원본에서 필드를 확인하거나 인덱스에서 값을 반환하는 쿼리를 실행할 수 있습니다.

인덱스는 null 또는 잘못된 값을 수정하기에 가장 좋은 위치가 아닙니다. 데이터베이스 또는 영구 스토리지 또는 인덱싱 전에 수행하는 데이터 정리 단계에서 원본의 데이터 문제를 해결해야 합니다.

패싯 버킷 순서 지정

버킷 내에서 정렬할 수 있지만 탐색 구조 전체에서 패싯 버킷의 순서를 제어하는 매개 변수는 없습니다. 패싯 버킷을 특정 순서로 원하는 경우 애플리케이션 코드에 제공해야 합니다.

패싯 수의 불일치

특정 상황에서는 분할 아키텍처로 인해 패싯 수가 완전히 정확하지 않을 수 있습니다. 모든 검색 인덱스는 여러 개의 분할된 데이터베이스에 분할되며, 각 분할된 데이터베이스는 문서 수에 따라 상위 N개의 패싯을 보고합니다. 이 값이 단일 결과로 통합됩니다. 각 분할된 데이터베이스의 상위 N개 패싯만 해당하므로 패싯 응답에서 일치하는 문서를 놓치거나 과소 계수할 수 있습니다.

정확도를 보장하기 위해 count:<number>를 인위적으로 큰 숫자로 늘려 각 분할된 데이터베이스에서 전체 보고를 강제로 적용할 수 있습니다. 무제한 패싯의 경우 "count": "0"을 지정하면 됩니다. 또는 "count"를 패싯 필드의 고유 값 수보다 크거나 같은 값으로 설정할 수 있습니다. 예를 들어 고유 값이 5개인 "size" 필드로 패싯하는 경우 모든 일치 항목이 패싯 응답에 표시되도록 "count:5"를 설정할 수 있습니다.

이 해결 방법은 쿼리 대기 시간이 늘어나는 단점이 있으므로 꼭 필요한 경우에만 사용합니다.

비동기적으로 필터링된 결과와 별개로 페싯 탐색 구조를 유지하세요.

Azure AI Search에서는 현재 결과에 대해서만 패싯이 존재합니다. 그러나 사용자가 역방향으로 탐색하여 검색 콘텐츠를 통해 대체 경로를 탐색할 수 있도록 정적 패싯 집합을 유지하는 것이 일반적인 애플리케이션 요구 사항입니다.

동적 드릴다운 환경과 함께 정적 패싯 집합을 원하는 경우 필터링된 두 쿼리를 사용하여 구현할 수 있습니다. 하나는 결과로 범위가 지정되고 다른 하나는 탐색 목적으로 패싯의 정적 목록을 만드는 데 사용됩니다.

필터를 통해 큰 패싯 수 오프셋

너무 큰 검색 결과 및 패싯 결과는 필터를 추가하여 트리밍할 수 있습니다. 다음 예제에서는 클라우드 컴퓨팅 쿼리에서 254개 항목에 콘텐츠 형식으로 내부 사양 이 있습니다. 결과가 너무 크면 필터를 추가하면 사용자가 조건을 더 추가하여 쿼리를 구체화하는 데 도움이 될 수 있습니다.

항목은 상호 배타적이지 않습니다. 하나의 항목이 두 필터 조건을 모두 충족하는 경우에는 각각 하나로 계수됩니다. 이 중복은 주로 문서 태깅을 구현하는 데 사용되는 Collection(Edm.String) 필드를 패싯할 때 발생합니다.

Search term: "cloud computing"
Content type
   Internal specification (254)
   Video (10)

다음 단계