0

問題があり、どこから始めればよいかわかりません:

  • ジオローカライズ データを選択するユーザーがいます (例: サンフランシスコ、50 マイル)
  • これ(例:サンノゼ)で検索を実行し、周囲に都市があるユーザーを返す必要があります。

私は Sphinx (ただし、変更はオプションである可能性があります) と MySQL を使用しています。インデックス作成中にすべての都市で複数の属性を作成しようとしました。インデックス作成中にサーバーがクラッシュしました。そこで、User -> City リンクをデータベースに格納する cron を作成します。Sphinx では問題なく動作しますが、私の cron は少し欲張りすぎます (そして、テーブルは非常に急速に大きくなり、ユーザーは周囲に 1000 近くの都市を持つことができます)。

これに対する良い解決策を知っていますか?

ありがとう

4

2 に答える 2

0

これは Sphinx を通じて可能です。latitudeデータベースに各都市がありlongitude、Sphinx に属性として追加する必要があります。

Sphinx は、魔法の関数を使用して@geodist範囲内の関心のあるポイント (POI) を計算します。

以下のように Sphinx 設定ファイルを変更する必要があります。

source geolocation
{
    sql_query            = select city_id, radians(longitude) as longitude,   
                           radians(latitude) as latitude from cities 
    sql_attr_float       = longitude
    sql_attr_float       = latitude
}

sql_queryは関数を使用しradiansて変換することに注意してくださいdegrees to radianssql_attr_float経度/緯度が float であることを Sphinx に伝えます。これはマジック@geodist機能に必要です。sql_query_infoコマンドラインでデバッグする場合に便利です。

以下はPHP、Sphinx Search を実行して Geo Location 検索を取得するコードです。

$_longitude = $_GET['longitude'];
$_latitude = $_GET['latitude'];
$_radius = $_GET['radius'];

$search = new SphinxClient();
$search->SetServer("localhost", 3312);
$search->SetMatchMode(SPH_MATCH_ALL);
$search->SetArrayResult(true);
$search->SetLimits(0, 100);
$search->SetGeoAnchor('latitude', 'longitude', (float) deg2rad($_latitude),  
                     (float) deg2rad($_longitude));

$circle = (float) $_radius * 1.61;
$search->SetFilterFloatRange('@geodist', 0.0, $circle);

$result = $search->Query('', 'geolocation');
于 2013-02-08T09:41:51.483 に答える