2015-04-28 97 views
4

我正在開發一個求職門戶,最終用戶將根據他們的位置和鄰近半徑搜索作業。目前REST API由SLIM和MySQL提供支持。 在Jobs表中,每行都有經度和緯度。我在這裏搜索了這個,偶然發現了Geo Distance search with MySQL使用PHP和MySQL的地理位置半徑搜索

SELECT latitude, longitude, SQRT(
POW(69.1 * (latitude - $lat), 2) + 
POW(69.1 * ($long - $long) * COS(latitude/57.3), 2)) AS distance 
FROM TableName HAVING distance < 25 ORDER BY distance; 


Where 

$lat = User latitude 

$long = User longitude 

現在我還有兩個問題。

  1. 如果只有MySQL查詢足夠了,或者我必須使用它設置Elastic Search?
  2. 如果有任何庫或軟件包可以幫助我解決這個特定問題?

而且如果您可以爲搜索性能提供任何可能有用的建議。

回答

0

我已經下面 -

SELECT id,name,lat,lng, ROUND((6371 * acos(cos(radians($lat)) * cos(radians(lat)) * cos(radians(lng) — radians($lng)) + sin(radians($lat)) * sin(radians(lat)))),(2)) AS distance FROM jobs HAVING distance < 50 ORDER BY distance; 

我做標杆無線發現這個數據比穆克什的答案稍快,比@ jision的答案要好2倍。

6
SELECT latitude, longitude, SQRT(
POW(69.1 * (latitude - $lat), 2) + 
POW(69.1 * ($long - longitude) * COS(latitude/57.3), 2)) AS distance 
FROM TableName HAVING distance < 25 ORDER BY distance; 

$ LAT =用戶緯度

$長=用戶經度

+0

此查詢是否足夠,或者我必須使用彈性搜索進行快速處理? –

2
You have two option to find job by location 

you required 
1. Search users lat long 
2. Job users Posted Lat long (it may be job location or job posted user location from database) 
3. Query will be like - 
SELECT zip,Round(((ACOS(SIN('$lat' * PI()/180) * SIN(latitude * PI()/180) + COS('$lat' * PI()/180) * COS(latitude * PI()/180) * COS(('$lon'-longitude) * PI()/180)) * 180/PI()) * 60 * 1.1515),(2)) AS distance FROM Jobs Having distance <= 30 

Else 
1. You have to call all jobs data in single query. 

    foreach($joblist as $job){ 
     $milesresult = $this->calculateDistance($user_lat,$user_lon,$job['latitude'],$jobr['longitude']); 
     $miles = explode("-",$vendor['miles']); 
     $vendor_max_miles = $miles[1]; 
     } 

2. PHP function for lat long 

     function calculateDistance($lat1, $lon1, $lat2, $lon2, $unit) { 

      $theta = $lon1 - $lon2; 

      $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 

      $dist = acos($dist); 

      $dist = rad2deg($dist); 

       $miles = $dist * 60 * 1.1515; 
      $unit = strtoupper($unit); 

      if ($unit == "K") { 
       return ($miles * 1.609344); 
      } else if ($unit == "N") { 
       return ($miles * 0.8684); 
       } else { 
        return $miles; 
       } 
     } 
+0

奧基偉大的方式!我必須首先計算距離,然後在查詢中對特定結果進行簡單的算術運算。 btw你認爲@ jision的答案更簡單嗎? –

+0

還有一件事,我是否需要在其中實現彈性搜索以提高性能,只要它足夠好? –

+1

第一個很相似。如果您在查詢中使用having子句,則需要時間來運行查詢。如果你使用第二個,它將分配加載時間。是的,你確定你實現了彈性搜索,它將成爲另一種加載和快速結果的選項 –