0

私はelasticaを使用してElasticSearchを学習し、クエリの方法を理解するために接続し、取得するのが難しい情報を見つけようとしています。

つまり、基本的に私がやろうとしているのは、Elastic Searchにデータを挿入し、地理座標を追加しました。次に、取得した結果を最も遠い順に並べ替えるクエリを実行できるようにする必要があります。

自分の州にあるすべての店舗を見つけて、現在の場所に最も近い店舗を注文したかったのです。

したがって、「state」と呼ばれるフィールドと「point」と呼ばれるフィールドが与えられます。これは、elasticaを使用してlong / Latを保持する配列です。クエリはどうなりますか?

あなたが私に与えることができるどんな助けにも感謝します。

4

2 に答える 2

1

まず、ロケーションフィールドをタイプとしてマッピングgeo_pointする必要があります(これは、データを挿入する前に行う必要があります

{
    "stores" : {
        "properties" : {
            "point" : {
                "type" : "geo_point"
            }
        }
    }
}

その後、検索を次のように並べ替えることができます_geo_distance

{
    "sort" : [
        {
            "_geo_distance" : {
                "stores.point" : [-70, 40], // <- reference starting position
                "order" : "asc",
                "unit" : "km"
            }
        }
    ],
    "query" : {
        "match_all" : {}
    }
}

Elasticaについては、マッピングクエリ構築に関するドキュメントをご覧になり、単体テストをお読みください。

于 2012-09-23T19:30:27.817 に答える
0

距離で並べ替えたい場合は、このカットダウンスニペットでカスタムスコアの使用方法を詳しく説明します。

    $q = new BoolQuery();

    $subQ = new MultiMatchQuery();
    $subQ->setQuery('find me')->setFields(array('foo', 'bar'));
    $q->addShould($subQ);

    $cs = new CustomScore();

    $cs->setScript('-doc["location"].distanceInKm(lat,lon)');
    $cs->addParams(array(
        'lat' => -33.882583,
        'lon' => 151.209737
    ));

    $cs->setQuery($q);

それが役に立てば幸い。

于 2013-07-29T06:43:09.843 に答える