2012-09-22 72 views
0

我正在嘗試使用elastica來學習ElasticSearch來連接和查找難以獲取的信息,以瞭解如何查詢它。根據位置使用elastica對結果進行排序

所以基本上我試圖做的是,我已經插入數據到彈性搜索,添加地理座標,現在我需要做的就是能夠運行一個查詢,將排序結果我得到最接近到最遠。

我想找到我所在州的所有商店,然後根據哪個商店最接近我的當前位置進行訂購。

因此給出了一個名爲「狀態」的字段和一個名爲「point」的字段,這是一個使用elastica保存long/Lat的數組,這個查詢會是什麼?

感謝您的任何幫助,您可以給我。

回答

1

首先,你需要map您的位置字段作爲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,看看他們的文檔mappingquery building,並閱讀單元測試。

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); 

希望它能幫助。

相關問題