검색 쿼리 결과 정렬

에이미 운루, 2012년 10월
Google 개발자 담당

소개

이 강의에서는 원하는 순서로 쿼리 검색의 결과를 정렬하는 방법을 설명합니다.

  • 필드 값 또는 필드 값을 포함하는 표현식으로 정렬할 수 있습니다.
  • 문서의 실행 빈도 순위에 따라 점수를 정렬하거나 보다 복잡한 순위 표현식에서 해당 점수를 사용할 수 있습니다.
  • 다차원적으로 정렬할 수 있습니다. 주로 하나의 필드 표현식으로 정렬한 다음 보조로 다른 필드 표현식으로 정렬하는 방식으로 수행됩니다.

예시 애플리케이션을 사용하면 사용자가 관련성 측정값을 기준으로 정렬하거나 문서 필드에서 2차원 정렬을 수행할 수 있습니다.

목표

Search API 검색 쿼리의 결과를 정렬하는 방법을 알아봅니다.

기본 요건

이 강좌의 선행 강좌인 Python Search API 시작하기

또한 다음이 필요합니다.

SortOptions 클래스

SortOptions 클래스는 쿼리 결과 정렬 순서를 정의하는 토대를 제공합니다. 정의되면 SortOptions objectQueryOptions 객체의 sort_options 매개변수로 사용됩니다.

from google.appengine.api import search

search.QueryOptions(
    sort_options=search.SortOptions(...)
    ...)

정렬 표현식

SortOptions 생성자SortExpression 객체의 반복자인 expressions 인수를 전달할 수 있습니다. 이렇게 하면 문서 필드 값을 기준으로 다차원 정렬을 수행할 수 있습니다.

예시 애플리케이션의 docs.Product 클래스에서는 다음과 같은 목록이 표시됩니다.

_SORT_OPTIONS = [
    [AVG_RATING, 'average rating', search.SortExpression(
        expression=AVG_RATING,
        direction=search.SortExpression.DESCENDING, default_value=0)],
    [PRICE, 'price', search.SortExpression(
        expression=PRICE,
        direction=search.SortExpression.ASCENDING, default_value=9999)],
    [UPDATED, 'modified', search.SortExpression(
        expression=UPDATED,
        direction=search.SortExpression.DESCENDING, default_value=1)],
    [CATEGORY, 'category', search.SortExpression(
        expression=CATEGORY,
        direction=search.SortExpression.ASCENDING, default_value='')],
    [PRODUCT_NAME, 'product name', search.SortExpression(
        expression=PRODUCT_NAME,
        direction=search.SortExpression.ASCENDING, default_value='zzz')]
  ]

이는 제품 문서 필드의 하위 집합을 위한 SortExpression 객체를 정의합니다. 각 정의에서 expression 매개변수는 단순히 필드의 이름입니다. 나중에 다른 표현식 변형을 볼 수 있습니다. 각 정렬 표현식은 정렬 방향(ASCENDING 또는 DESCENDING) 및 기본값을 정의합니다. 이는 문서가 표현식에 주어진 필드를 포함하지 않는 경우 사용됩니다.

handlers.py에서는 ProductSearchHandler.doProductSearch() 메소드가 이 정의를 사용하여 2차원 정렬을 정의합니다. 이는 SortExpression 객체의 정렬된 목록을 정의하고 이 목록을 SortOptions 생성자의 expressions 매개변수에 전달하는 방식으로 이루어집니다. 사용자가 평균 등급별 정렬을 요청하면 가격별 보조 정렬을 수행합니다.

sortopts = search.SortOptions(expressions=[
    search.SortExpression(expression=docs.Product.AVG_RATING, direction='DESCENDING', default_value=0),
    search.SortExpression(expression=docs.Product.PRICE, direction='ASCENDING', default_value=9999)])

그렇지 않으면(사용자가 가격순으로 정렬을 요청하면) 보조 정렬은 평균 평점별로 수행됩니다.

sortopts = search.SortOptions(expressions=[
    search.SortExpression(expression=docs.Product.PRICE, direction='ASCENDING', default_value=9999),
    search.SortExpression(expression=docs.Product.AVG_RATING, direction='DESCENDING', default_value=0)])

그런 다음 이전처럼 이 객체를 QueryOptions 생성자에 전달합니다.

search.QueryOptions(
    sort_options=sortopts
    ...)

정렬 표현식에서 표현식 함수 사용

SortExpression 객체의 expression 속성은 필드 이름 이상일 수 있습니다. 이전 강의에서 언급한 표현식 함수(예: max)를 사용할 수도 있습니다. 예를 들어 다음 정렬 표현식은 판매세를 포함하도록 조정된 price 필드 값별로 정렬합니다.

search.SortExpression(
    expression='price * 1.08',
    direction=search.SortExpression.ASCENDING, default_value=9999)]

GeoPoint 필드를 거리별로 정렬

주어진 거리 내에 있는 모든 매장을 찾는 것도 좋지만 매장까지의 거리별로 정렬하면 더 좋을 것입니다. 내장된 distance 함수를 사용하여 정렬 표현식을 추가하여 이 작업을 수행할 수 있습니다. 다음 쿼리는 사용자의 위치에서 4.5km 내에 있는 모든 매장을 찾아 가장 가까운 거리에서 가장 먼 거리까지 오름차순으로 정렬합니다.

index = search.Index(config.STORE_INDEX_NAME)
user_location = (-33.857, 151.215)
query = "distance(store_location, geopoint(%f, %f)) < %f" % (
    user_location[0], user_location[1], 45000)
loc_expr = "distance(store_location, geopoint(%f, %f))" % (
    user_location[0], user_location[1])
sortexpr = search.SortExpression(
    expression=loc_expr,
    direction=search.SortExpression.ASCENDING, default_value=45001)
search_query = search.Query(
    query_string=query,
    options=search.QueryOptions(
        sort_options=search.SortOptions(expressions=[sortexpr])))
results = index.search(search_query)

일치 점수

MatchScorer 클래스는 용어 실행 빈도에 기반하는 점수를 사용하여 오름차순으로 문서를 정렬하는 데 사용됩니다. MatchScorer 객체는 SortOptions 생성자의 match_scorer 매개변수로 전달됩니다.

sortopts = search.SortOptions(match_scorer=search.MatchScorer())
search.QueryOptions(
    sort_options=sortopts
    ...)

예제 애플리케이션은 사용자가 UI의 쿼리 정렬 메뉴에서 관련성을 선택하는 경우 이 정렬을 사용합니다.

특수 필드 이름 _score를 사용하여 정렬 표현식의 문서 점수에 액세스할 수도 있습니다. 이러한 경우 SortOptions 객체에는 scorer가 있어야 합니다. 예는 다음과 같습니다.

search.SortOptions(match_scorer=search.MatchScorer(),
    expressions=[search.SortExpression(...),...])

요약 및 검토

이 강의에서는 SortExpressionMatchScorer 객체를 지정하고 해당 객체를 사용하여 QueryOptions 생성자에 전달된 SortOptions 객체를 빌드하는 방식으로 검색 결과에서 다차원 정렬을 정의하는 방법을 배웠습니다.

사용 방법을 이해하고 있는지 확인하려면 정렬 표현식을 조금 더 시험해 보세요. 예를 들어 ProductSearchHandler.doProductSearch()SortOptions 객체로 정의된 정렬 차원을 다른 차원에서 보조 정렬을 수행하여 변경해 보세요. 또는 정렬 차원 중 하나의 정렬 방향을 변경해 보세요.

다음 강의에서는 Search API 문서를 검색, 삭제, 다시 색인화하는 방법을 학습합니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

App Engine의 Python