6

GAE検索インデックスに約400,000のドキュメントがあります。すべてのドキュメントにはlocation GeoPointプロパティがあり、世界中に広がっています。一部のドキュメントは他のドキュメントから4000km以上離れている場合があり、その他のドキュメントは互いに数メートル以内に集まっている場合があります。

特定の座標セットに最も近いドキュメントを見つけたいのですが、次のコードで間違った結果が得られます。

from google.appengine.api import search

# coords are in the form of a tuple e.g. (50.123, 1.123)
search.Document(
    doc_id='meaningful-unique-id',
    fields=[search.GeoField(name='location' 
                            value=search.GeoPoint(coords[0], coords[1]))])

# find document function radius is in metres
def find_document(coords, radius=1000000):
    sort_expr = search.SortExpression(
        expression='distance(location, geopoint(%.3f, %.3f))' % coords,
        direction=search.SortExpression.ASCENDING,
        default_value=0)

    search_query = search.Query(
        query_string='distance(location, geopoint(%.3f, %.3f)) < %d' \
                    % (coords[0], coords[1], radius),
        options=search.QueryOptions(
            limit=1,
            ids_only=True,
            sort_options=search.SortOptions(expressions=[sort_expr])))

    index = search.Index(name='document-index')
    return index.search(search_query)

このコードを使用すると、一貫性はあるが正しくない結果が得られます。たとえば、ロンドンに最も近いドキュメントを検索すると、最も近いドキュメントはスコットランドにあることがわかりました。私は何千ものより近い文書があることを確認しました。

radiusパラメータが大きすぎることに問題を絞り込みました。半径が約12km()まで下がると正しい結果が得られますradius=12000。通常、半径12kmには1000を超えるドキュメントはありません。(おそらくに関連付けられていsearch.SortOptions(limit=1000)ます。)

問題は、私が地球のまばらな地域にいて、何千マイルもドキュメントがない場合、検索機能がradius=12000(12km)で何も返さないことです。どこにいても、最も近いドキュメントを返してほしい。Search APIを1回呼び出すだけで、これを一貫して達成するにはどうすればよいですか?

4

3 に答える 3

5

問題は次のとおりだと思います。クエリは最大10Kのドキュメントを選択し、それらは距離ソート式に従ってソートされて返されます。(つまり、このソートは実際にはすべての40万ドキュメントに及ぶわけではありません。)したがって、地理的に近いポイントの一部がこの10kの選択に含まれていないのではないかと思います。そのため、検索範囲を狭くすると、その範囲内の合計ポイントが少なくなるため、状況が改善されます。

基本的に、クエリの「ヒット数」を10kまで下げたいと考えています。これは、クエリの対象となる意味に合った方法です。これには、少なくともいくつかの方法で対処できます。これらを組み合わせることができます。

  • ランキングを追加して、最も「重要な」ドキュメント(ドメインで意味のあるいくつかの基準による)がランク順に返されるようにします。その後、これらは距離で並べ替えられます。
  • 1つ以上のドキュメントフィールド(たとえば、ドキュメントにビジネスに関する情報が含まれている場合は「ビジネスカテゴリ」)でフィルタリングして、候補となるドキュメントの数を減らします。

(この10kのしきい値は、現在Search APIのドキュメントにあるとは思いません。追加するためのチケットを提出しました)。

于 2013-03-12T00:37:51.420 に答える
1

私はまったく同じ問題を抱えていますが、それは不可能だと思います。問題は、返された結果よりも多くの可能性のある結果がある場合に自分で理解したときに発生します。Googleアルゴリズムは、制限を読み込んだときに終了し、結果を並べ替えます。

私はあなたと同じクラスターとその検索APIの一部を見てきました。

1つのハックは、検索をサブセクターに分割し、複数の同時呼び出しを実行してから、結果をマージして並べ替えることです。

于 2013-03-11T12:25:39.010 に答える
0

ワイルドなアイデアです。3ポイントからの距離を保持/記録して、そこから計算してみませんか。

于 2013-03-11T14:31:05.907 に答える