Сортировка Algolia по геолокации в Swift

#swift #sorting #geolocation #algolia

#swift #сортировка #геолокация #algolia

Вопрос:

У меня проблема с сортировкой геолокации Algolia в приложении iOS. Мне нужно отобразить все документы в радиусе 100 км от местоположения пользователя. У меня в индексе есть несколько документов. Документ выглядит следующим образом:

 "document": {
    "price": 5000,
    "unit": "cały projekt",
    "_geoloc": {
      "lat": 54.5,
      "lng": 18.55
    },
    "title": "Test ogloszenia",
    "range": 0,
    "activeFrom": {
      "_seconds": 1597042800,
      "_nanoseconds": 0
    }
}
  

В моем ранжировании и сортировке Algolia у меня по умолчанию установлен GEO.

Мой Swift-код для сортировки местоположений выглядит следующим образом:

 func getAnnouncesLocation(location: CLLocationCoordinate2D, completion: @escaping ([Announcement]) -> ()) {
        var announcementsArray = [Announcement]()
        let query = Query(query: "")
        
        
        query.aroundLatLng = LatLng(lat: location.latitude, lng: location.longitude)
        query.aroundRadius = .explicit(100000) // 100 km
        collectionIndex = searchClient.index(withName: "products_geolocation")
        collectionIndex.search(query) { (content, error) in
            guard let content = content else {
                if let error = error {
                    print(error.localizedDescription)
                    
                }
                  
                return
            }
            print("HITS (content)")
        }
     }
  

Код не возвращает никакой ошибки, но содержимое пустое.
Другая сортировка, например, по цене, работает отлично. Единственная проблема связана с геолокацией.
Если это может помочь настроить сортировку по цене, мне нужно добавить атрибут сортировки по, подобный этому: document.price на панели инструментов.

Я сохраняю данные в Algolia со своего сервера в Node.js и там я создаю _geoloc значение. Широта и долгота жестко запрограммированы для тестирования, поэтому проблем с асинхронностью нет.

Спасибо за любую помощь.

С уважением, Мэтт

Ответ №1:

Я обнаружил ошибку в своем проекте. При отправке документа в Algolia я отправляю вот так:

    const record = {
        objectID: doc.id,
        document: document
    };
  

где document содержались все свойства, а также _geoloc свойство. После некоторого расследования я отделился _geoloc от документа, который я отправил, как показано ниже:

    const record = {
        objectID: doc.id,
        document: document,
        _geoloc: coordinates

    };
  

Теперь все работает нормально.

Приветствия