検索クエリ結果の並べ替え

2012 年 10 月、Amy Unruh
Google Developer Relations

はじめに

このレッスンでは、クエリ検索の結果を任意の順序に並べ替える方法を学習します。

  • 並べ替えは、フィールド値または値が含まれる式に基づいて行うことができます。
  • ドキュメントの頻度順に基づくスコアで並べ替えることも、そのスコアをより複雑なランキング式で使用することもできます。
  • 多次元で並べ替えることも、1 つのフィールド式に基づいて 1 次並べ替えを行い、別の式に基づいて 2 次の並べ替えを行うことも可能です。

アプリケーションの例では、関連性に基づいて並べ替えるか、ドキュメント フィールドで 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 では、SortExpression オブジェクトの順序付きリストを定義し、そのリストを SortOptions コンストラクタの expressions パラメータとして渡すことで、ProductSearchHandler.doProductSearch() メソッドがこれらの定義を使用し、2 次元の並べ替えを定義します。ユーザーが平均評価による並べ替えをリクエストした場合は、次のように価格による二次並べ替えを行います。

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.5 km 以内の全店舗を検索し、距離の昇順(近から遠へ)で並べ替えます。

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 オブジェクトには次のようなスコアラーを含みます。

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

まとめと確認

このレッスンでは、SortExpression および MatchScorer オブジェクトを指定し、それらを使用して QueryOptions コンストラクタに渡される SortOptions オブジェクトを構築し、検索結果に対して多次元の並べ替えを行う方法を学びました。

さらに並べ替え式を使用してテストを行い、使用方法をご確認ください。たとえば、ProductSearchHandler.doProductSearch()SortOptions オブジェクトによって定義された並べ替え次元を変更して、別の次元で二次並べ替えを行うことを試してみましょう。または、1 つの並べ替え次元の並べ替え方向を変更することもお試しください。

次のレッスンでは、Search API ドキュメントを取得、削除、インデックス再作成する方法を学習します。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...