2013-11-13 7 views
0

Я использую API-интерфейс elasticSearch. Я хочу искать сообщения, которые находятся вокруг определенного момента. Таким образом, сообщение имеет поле координат. Вот мой код, чтобы добиться отображения:Эластичный поиск: Нулевые результаты для фильтра Geodistance

String mappingString = 
     "{" 
     + "\"posts\" : {" 
     +  "\"properties\" : {" 
     +   "\"coordinates\" : {" 
     +    "\"type\" : \"geo_point\"" 
     +   "}" 
     +  "}" 
     + "}" 
     +"}";  

Client.admin().indices().preparePutMapping("posts").setType("posts").setSource(mappingString).execute().actionGet(); 

Я проверяемый ElasticSearch голову, что я на самом деле есть посты в индексе, который должен пройти через фильтр. Сообщение выглядит так:

{ 
"link":"http://instagram.com/p/hBV...EjHk/", 
"pictureURL":"http://distilleryimage0.s3.amazonaws.com/b5887...8f21ef_6.jpg", 
"userID":"358...3", 
"commentsCount":0, 
"likesCount":2, 
"coordinates":{"lat":32.519634,"lon":33.414997}, 
"userName":"tuvs...yahde", 
"nGrams":[], 
"id":"IG_5948523...879524_358...163", 
"indexDate":1385131949 
} 

Это будет храниться в индексе с именем «posts». Тем не менее, у меня есть разные типы в этом индексе, все из которых разделяют поля координат, id и indexDate, но могут отличаться в других полях (это потому, что у некоторых сообщений есть картинки, у других - текст, у других - оба).

Наконец, вот код, который я использую для запроса ElasticSearch:

GeoDistanceFilterBuilder gdFilter = FilterBuilders.geoDistanceFilter("posts.coordinates") 
    .point(lat, lon) 
    .distance(distanceInMeters, DistanceUnit.METERS) 
    .optimizeBbox("memory")      
    .geoDistance(GeoDistance.ARC);    

SearchResponse response = Client.prepareSearch("posts") 
    .setQuery(QueryBuilders.matchAllQuery()) 
    .setFilter(gdFilter) 
    .setSize(100) 
    .execute() 
    .actionGet(); 

Проблема в том, что любые значения, я использую для переменных в запросе, и фильтр, я всегда получаю нулевой результат. Может ли кто-нибудь увидеть, что я делаю неправильно?

ответ

1

Это должно быть .point(lat, lon).

+0

Вы правы. Однако это, к сожалению, не решает мою проблему. Я переключил эти два параметра по 10 раз (вероятно, там, где возникла ошибка), попробовав его разными комбинациями для других параметров. Но все равно не повезло ... –

+0

Можете ли вы представить весь пример, используя ваши тестовые данные? – imotov

+0

Я добавил больше контекста. (Извините за задержку.) –

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