2015-02-15 2 views
0

Я пытаюсь реализовать геодезический поиск по электронной почте с помощью elasticsearch.
Как правило, это работает, но если я выполняю поиск почтового индекса, который имеет листинг, в некоторых случаях это листинг вообще не отображается. Но другие списки вне почтового индекса (в пределах диапазона) действительно появляются. Я ожидал, что листинг с тем же почтовым индексом появится в верхней части остальных, но он вообще не отображается.Запрос о elasticsearch geo distance postcode поиск

Это код PHP, который у меня есть.

Я полный новичок, когда дело доходит до elasticsearch, и я просто работаю с существующим кодом elasticsearch, который был настроен предыдущим разработчиком.

Благодаря

$es = new Elasticsearch\Client(); 

include('helpers/geoHelper.php'); 
$geo = new geoHelper(); 
$geoData = $geo->getLatLngFromAddress($postcode.',+AU'); 
$params['body']['sort']['_geo_distance']['location']['lat']= $geoData->lat; 
$params['body']['sort']['_geo_distance']['location']['lon']= $geoData->lng; 
$params['body']['sort']['_geo_distance']['order'] = 'asc'; 
$params['body']['sort']['_geo_distance']['unit'] = 'km'; 
$params['body']['sort']['_geo_distance']['distance_type'] = 'plane'; 

$params['body']['fields'] = '_source'; 
$params['body']['script_fields']['distance']['lang'] = 'groovy'; 
$params['body']['script_fields']['distance']['params'] = array(
     'lat' => $geoData->lat, 
     'lon' => $geoData->lng 
); 

$params['body']['script_fields']['distance']['script'] = "doc['location'].distanceInKm(lat,lon)"; 

$filter_distance = array(
     'distance' => '200km', 
     'location' => array(
     'lat' => $geoData->lat, 
     'lon' => $geoData->lng, 
     ) 
); 
$params['body']['query']['filtered']['filter']['geo_distance'] = $filter_distance; 
$params['body']['size']=25 
$params['body']['from']=1 
$params['index'] = 'shops'; 
$params['type'] = 'shop'; 

$data = new stdClass(); 
$data->results = $es->search($params); 

ответ

1

Я также столкнулся с такой же вопрос с этой библиотекой и попытаться найти помощь по Интернету. , но теперь я решил эту проблему, используя Query DSL вместо использования формата массива, я просто создаю действительный запрос JSON и передаю вам параметр body. Например,

Array 
(
[index] => spnew 
[type] => sprovider_new 
[body] => {"from":0,"size":15,"sort":[{"_geo_distance":{"geo_location":{"lat":18.9295932,"lon":72.8327296},"order":"asc","unit":"km"}},{"likes_count":{"order":"desc"}},{"reviews.created_time":{"order":"desc"}}],"query":{"bool":{"must":[{"term":{"status":"1"}},{"term":{"category.category_id":"103"}},{"term":{"parent_service_id":"0"}},{"term":{"city_id":"1"}}]}}} 
) 

Это может вам помочь. вы также можете посмотреть это: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/decay-functions.html

Смежные вопросы