Сравните Distance() со значением поля в документе

Я использую движок приложения Google с java и API поиска Google. Сохраняю документы с геоточкой и максимальным расстоянием.

Document.Builder builder = Document.newBuilder()
     .addField(Field.newBuilder().setName("location").setGeoPoint(new GeoPoint(lat, lon)))
     .addField(Field.newBuilder().setName("radius").setNumber(radiusInMeter));

Теперь я хочу запросить все документы, в которых заданный радиус находится в пределах расстояния до заданной геоточки, например:

String queryString = "radius > distance(location, geopoint(" + lat + ", " + lon + "))";
Query query = Query.newBuilder().setOptions(options).build(queryString);

Однако, если я это сделаю, я получу следующее исключение:

SearchException: невозможно сравнить «радиус» с «расстоянием ()»

Итак, мой вопрос: как я могу добиться своего варианта использования с API поиска Google?


person JonasH    schedule 16.07.2015    source источник


Ответы (1)


Из документов (выделено мной):

distance(point1, point2)

Вычисляет расстояние в метрах между двумя геоточками. Каждая точка может быть указана с помощью имени поля геоточки или вызова функции геоточки. Обратите внимание, что вы не можете указать два имени поля в качестве аргументов для этой функции. По крайней мере один аргумент должен быть константой.

Я не знаю вашего варианта использования, но, возможно, вы можете определить radius до выполнения поиска, чтобы вы могли указать его как константу в строке запроса?

person tx802    schedule 16.07.2015
comment
Спасибо за разъяснения! Я попробовал другой запрос, например следующий: радиус = 500 И 500 › расстояние (местоположение, геоточка (+ широта +, + долгота +)), но это тоже не работает (SearchException: временная ошибка службы поиска). API, кажется, очень ограничивает вычисления геоточки. - person JonasH; 16.07.2015
comment
Я предполагаю, что 500 > distance(location, geopoint(lat,lon)) работает? - person tx802; 16.07.2015
comment
Да, это работает, но не дает возможности иметь переменные радиусы. Теперь я должен использовать жестко закодированные радиусы и перебирать каждый набор, чтобы удалить те, которые находятся в меньшем наборе радиусов. Не очень производительно с большим набором данных. - person JonasH; 11.09.2015