속성별 검색

상품 속성별 검색을 사용하면 문서에 카테고리 정보를 연결할 수 있습니다. 상품 속성은 속성/값 쌍입니다. 예를 들어 이름이 'size'인 상품 속성의 값은 'small', 'medium', 'large'입니다.

검색에 상품 속성을 사용하면 쿼리를 세분화하고 여러 단계에 걸친 결과를 '자세히 살펴보는' 데 도움이 되는 요약 정보를 검색할 수 있습니다.

이 기능은 고객이 제품 검색 범위를 좁혀 원하는 제품을 볼 수 있도록 필터 세트를 제공해야 하는 쇼핑 사이트와 같은 애플리케이션에 유용합니다.

상품 속성에 대해 집계된 데이터는 상품 속성 값이 분포된 방식을 보여줍니다. 예를 들어 'size' 상품 속성은 결과 집합에서 여러 문서에 표시될 수 있습니다. 이 상품 속성에 대해 집계된 데이터에는 'small' 값이 100회, 'medium' 값이 300회, 'large' 값이 250회 표시될 수 있습니다. 각 상품 속성/값 쌍은 쿼리 결과에 포함된 문서의 하위 집합을 나타냅니다. 상세검색이라 하는 키가 각 쌍과 연결됩니다. 쿼리에 상세검색을 포함하면 쿼리 문자열과 일치하고 하나 이상의 상세검색에 따라 상품 속성 값을 포함하는 문서를 검색할 수 있습니다.

검색 수행 시 수집하고 결과와 함께 표시할 상품 속성을 선택하거나, 문서에서 가장 많이 표시된 상품 속성을 자동으로 선택하도록 상품 속성 검색을 사용 설정할 수 있습니다.

문서에 상품 속성 추가

문서에 상품 속성을 추가한 후 색인에 문서를 추가합니다. 문서 필드를 지정하면서 동시에 이 작업을 수행합니다.

package app

import (
    "appengine"
    "appengine/search"
    "net/http"
)

type ComputerDoc struct {
    Name      search.Atom
    Type      search.Atom `search:",facet"`
    RAMSizeGB float64     `search:",facet"`
}

func handlePut(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    index, err := search.Open("products")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    _, err = index.Put(c, "doc1", &ComputerDoc{
        Name:      "x86",
        Type:      "computer",
        RAMSizeGB: 8.0,
    })
    // Handle err and write HTTP response.
}

상품 속성은 문서 필드와 비슷합니다. 상품 속성에는 이름이 있고 값 한 개를 사용합니다.

상품 속성 이름은 문서 필드와 동일한 규칙을 따릅니다. 이름은 대소문자를 구분하며 ASCII 문자만 포함할 수 있습니다. 문자로 시작해야 하며 문자, 숫자, 밑줄로 구성될 수 있습니다. 필드 이름은 영문 500자를 초과할 수 없습니다.

상품 속성의 값은 원자 문자열(영문 500자 이하) 또는 숫자(-2,147,483,647에서 2,147,483,647 사이의 배정밀도 부동 소수점 값)일 수 있습니다.

이름과 유형이 같은 상품 속성을 추가하고 매번 다른 값을 사용하여 한 문서에서 한 상품 속성에 여러 값을 할당할 수 있습니다.

상품 속성에 포함할 수 있는 값의 수에는 제한이 없습니다. 또한 문서에 추가할 수 있는 상품 속성 수 또는 색인에 있는 고유한 이름의 상품 속성 수에도 제한이 없습니다.

상품 속성을 사용할 때마다 원자 또는 숫자 값을 가질 수 있습니다. 이름이 'size'인 상품 속성을 문자열 값 'small'이 포함된 한 문서와 숫자 값 8이 포함된 다른 문서에 연결할 수 있습니다. 실제로 동일한 상품 속성이 두 종류의 값을 모두 포함한 채로 같은 문서에 여러 번 나타날 수 있습니다. 허용된다고 할지라도 동일 상품 속성에 원자 값과 숫자 값을 모두 사용하는 것은 피하는 것이 좋습니다.

상품 속성을 문서에 추가할 때 특정 유형이 포함된 경우, 검색 결과는 해당하는 모든 값을 수집합니다. 예를 들어, 상품 속성 'size'에 대한 결과에 'small' 값 인스턴스 100개, 'medium' 값 인스턴스 150개, [4, 8) 범위의 숫자 값 인스턴스 135개가 표시될 수 있습니다. 정확한 숫자 값과 해당 빈도 분포는 표시되지 않습니다.

쿼리를 사용해서 문서를 검색할 때는 해당 상품 속성 및 값에 직접 액세스할 수 없습니다. 다음 섹션에 설명된 대로 쿼리를 사용해서 상품 속성 정보가 반환되도록 요청해야 합니다.

상품 속성별 검색을 사용하여 상품 속성 정보 검색

검색 백엔드에 가장 자주 사용된 상품 속성을 검색하도록 요청할 수 있습니다. 이를 자동 상품 속성 검색이라고 부릅니다. 또한 이름이나 이름 및 값을 기준으로 상품 속성을 선택하여 상품 속성 정보를 명시적으로 검색할 수도 있습니다. 이 세 가지 종류의 상품 속성 검색을 하나의 단일 쿼리에서 모두 혼합하여 사용할 수 있습니다.

상품 속성 정보 요청은 쿼리가 반환하는 문서에는 영향을 주지 않지만, 성능에는 영향을 미칠 수 있습니다. 기본 깊이 1000으로 상품 속성별 검색을 수행하는 것은 정렬 옵션 점수 한도를 1000으로 설정하는 것과 동일한 효과가 있습니다.

자동 상품 속성 검색

자동 상품 속성 검색은 사용자 문서의 집계에 가장 자주 표시되는 상품 속성을 찾습니다. 예를 들어 쿼리와 일치하는 문서에 'red' 값이 5회, 'white' 값이 5회, 'blue' 값이 5회로 표시된 'color' 상품 속성이 있다고 가정해 보겠습니다. 이 상품 속성에는 총 15개의 값이 있습니다. 검색 목적에 따라 동일한 일치 문서에서 'dark' 값이 6회, 'light' 값이 7회로 표시된 또 다른 상품 속성인 'shade'보다는 이 속성이 순위가 높게 표시될 것입니다.

쿼리에서 다음과 같이 설정하여 상품 속성 검색을 사용 설정해야 합니다.

func handleSearch(w http.ResponseWriter, r *http.Request) {
    index, err := search.Open("products")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    it := index.Search(c, "name:x86", &search.SearchOptions{
        Facets: {
            search.AutoFacetDiscovery(0, 0),
        },
    })
    facets, err := it.Facets()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    for _, results := range facets {
        for i, facet := range result {
            // The facet results are grouped by facet name.
            // Print the name of each group before its values.
            if i == 0 {
                fmt.Fprintf(w, "Facet %s:\n", facet.Name)
            }
            fmt.Fprintf(w, "    %v: count=%d", facet.Value, facet.Count)
        }
    }
}

상품 속성을 검색하면 기본적으로 해당 상품 속성에서 가장 자주 발견되는 값 10개만 반환됩니다. AutoFacetDiscovery에 대한 첫 번째 매개변수를 사용하여 이 한도를 최대 100까지 늘릴 수 있습니다.

자동 상품 속성 검색에서는 가능한 모든 상품 속성과 해당 값을 반환하지 않습니다. 검색에서 반환되는 상품 속성은 실행 조건에 따라 다를 수 있습니다. 고정된 상품 속성 집합이 필요한 경우에는 쿼리에 return_facets 매개변수를 사용하세요.

문자열 값은 개별적으로 반환됩니다. 검색된 상품 속성의 숫자 값은 단일 범위 [최소 최대)로 반환됩니다. 이 범위를 조사하고 이후 쿼리를 위해 더 작은 하위 범위를 만들 수 있습니다.

이름별 상품 속성 선택

이름만 사용하여 상품 속성 정보를 검색하려면 상품 속성의 이름과 함께 FacetDiscovery를 해당 쿼리의 검색 옵션에 추가합니다.

it := index.Search(c, "name:x86", &search.SearchOptions{
    Facets: {
        FacetDiscovery("Type"),
        FacetDiscovery("RAMSizeGB"),
    },
})

이름으로 상품 속성을 검색하면 해당 상품 속성에 대해 가장 자주 발견되는 10개 값만 반환됩니다.

이름 및 값으로 상품 속성 선택

상품 속성의 특정 값에 대한 정보만 검색하려면 상품 속성의 이름 및 원하는 값과 함께 FacetDiscovery를 추가합니다.

it := index.Search(c, "name:x86", &search.SearchOptions{
    Facets: {
        // Fetch the "Type" facet with Values "computer" and "printer"
        FacetDiscovery("Type",
            search.Atom("computer"),
            search.Atom("printer"),
        ),
        // Fetch the "RAMSizeGB" facet with values in the ranges [0, 4), [4, 8), and [8, max]
        FacetDiscovery("RAMSizeGB",
            search.Range{Start: 0, End: 4},
            search.Range{Start: 4, End: 8},
            search.AtLeast(8),
        ),
    },
})

단일 FacetDiscovery의 값은 모두 search.Atom 값 목록이거나 숫자의 경우 왼쪽(시작)은 닫혀 있고 오른쪽(끝)은 열려 있는 구간인 search.Range 목록 중 하나로, 동일한 유형이어야 합니다. 상품 속성에 문자열 및 숫자 값이 혼합된 경우, 각 값에 대해 개별적으로 FacetDisovery 옵션을 추가합니다.

옵션

쿼리에 대해 SearchOptionsFacetDocumentDepth 옵션을 추가하면 상품 속성 정보 수집을 위해 평가할 최소 문서 수를 제어할 수 있습니다. 지정하지 않을 경우 이 깊이는 기본적으로 1000이 됩니다.

상품 속성 깊이는 일반적으로 쿼리 한도보다 훨씬 큽니다. 상품 속성 결과는 적어도 문서 깊이만큼 계산됩니다. 정렬 옵션 점수 제한을 깊이보다 높게 설정하면 점수 제한이 대신 사용됩니다.

상품 속성 결과 검색

쿼리에서 상품 속성별 검색 매개변수를 사용하면 집계된 상품 속성 정보가 쿼리 결과와 함께 제공됩니다.

검색 Iterator에는 집계된 상품 속성 정보를 [][]FacetResult로 반환하는 Facets 메서드가 있습니다. 쿼리와 일치하여 문서에 표시된 각 상품 속성에 대해 하나의 상품 속성 결과가 포함되도록 결과가 정리되어 표시됩니다. 각 결과에서는 다음을 얻을 수 있습니다.

  • 상품 속성 이름
  • 가장 자주 발견되는 값 목록에서 가져온 상품 속성 값 하나
  • 값이 발견된 대략적인 횟수

값 목록에는 상품 속성의 문자열 숫자 값이 포함됩니다. 상품 속성이 자동 검색된 경우, 해당 숫자 값은 단일 구간 [최소 최대)로 반환됩니다. 쿼리에서 범위를 한 개 이상 사용하여 숫자 상품 속성을 명시적으로 요청한 경우, 목록에는 각 범위에 대한 닫힘-열림 구간 [시작 끝) 한 개가 포함됩니다.

쿼리 옵션에 따라 조사할 문서 수 및 반환할 값 수가 결정되기 때문에 상품 속성 값 목록에는 문서에서 발견된 모든 값이 포함되지 않을 수 있습니다.

각 상품 속성에 대해 집계된 정보는 반복자에서 읽을 수 있습니다.

it := index.Search(...)
facets, err := it.Facets()  // And check err != nil.
for _, results := range facets {
    for _, facet := range results {
        ...
    }
}

예를 들어 쿼리를 통해 문자열 값 및 숫자 값이 있는 'size' 상품 속성을 포함하는 문서가 발견되었을 수 있습니다. 이 상품 속성의 결과는 다음과 같이 구성됩니다.

[][]search.FacetResult{
    {
        {Name: "size", Value: search.Range{Start: 8, End: 10}, Count: 22},
        {Name: "size", Value: search.Atom("small"), Count: 100},
        {Name: "size", Value: search.Atom("medium"), Count: 300},
        {Name: "size", Value: search.Atom("large"), Count: 250},
    },
}

상품 속성을 사용하여 쿼리 세분화/필터링

FacetResult를 사용해서 해당 상품 속성 값을 포함하는 문서만 포함하도록 결과 범위를 더 좁힐 수 있습니다. 이러한 키 중 하나 이상을 사용해서 쿼리를 세분화하려면 이를 검색 옵션으로 전달합니다.

it := index.Search(c, "...", &search.SearchOptions{
    Refinements: []search.Facet{
        facetResult1.Facet,
        facetResult2.Facet,
    },
})

동일 요청에서 1개 이상의 서로 다른 상품 속성에 대한 상세검색을 조합할 수 있습니다. 동일 상품 속성에 속하는 모든 상세검색은 OR로 연결하고, 서로 다른 상품 속성에 대한 상세검색은 AND로 결합됩니다.

또한 상세검색용으로 커스텀 Facet을 직접 만들 수도 있습니다. 자세한 내용은 해당 참조 문서를 참조하세요.