Синтаксис запроса сортировки геодистанс

Я использую astic4s версии 1.6.2 и мне нужно написать запрос, который ищет заданное географическое положение, сортирует результаты по расстоянию, а также возвращает расстояние. Я могу сделать это, используя запрос get в curl, но изо всех сил пытаясь найти правильный синтаксис и пример получил геолокации сортировки.

case class Store(id: Int, name: String, number: Int, building: Option[String] =     None, street: String, postCode: String,county: String, geoLocation: GeoLocation)

case class GeoLocation(lat: Double, lon: Double) 

val createMappings = client.execute {
create index "stores" mappings (
  "store" as(
    "store" typed StringType,
    "geoLocation" typed GeoPointType
    )
  )
}

def searchByGeoLocation(geoLocation: GeoLocation) = {
client.execute {
  search in "stores" -> "store" postFilter {
    geoDistance("geoLocation") point(geoLocation.lat, geoLocation.lon) distance(2, KILOMETERS)
  }


}
}

Кто-нибудь знает, как добавить сортировку по расстоянию от географического местоположения и получить расстояние Следующая команда curl работает как положено

curl -XGET 'http://localhost:9200/stores/store/_search?pretty=true' -d '
{
"sort" : [
  {
      "_geo_distance" : {
          "geoLocation" : {
                "lat" : 52.0333793839746,
                "lon" : -0.768937531935448
          }, 
          "order" : "asc",
          "unit" : "km"
      }
  }
],
"query": {
"filtered" : {
    "query" : {
        "match_all" : {}
    },
    "filter" : {
        "geo_distance" : {
            "distance" : "20km",
            "geoLocation" : {
                "lat" : 52.0333793839746,
                "lon" : -0.768937531935448
            }
        }
    }
}

} }'

1 ответ

Решение

Не эксперт в elasti4s но этот запрос должен быть эквивалентен вашей команде curl:

val geoLocation = GeoLocation(52.0333793839746, -0.768937531935448)
search in "stores" -> "store" query {
    filteredQuery filter {
      geoDistance("geoLocation") point(geoLocation.lat, geoLocation.lon) distance(20, KILOMETERS)
    }
  } sort {
    geoSort("geoLocation") point (geoLocation.lat, geoLocation.lon) order SortOrder.ASC
  }

он печатает следующий запрос:

{
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "geo_distance" : {
          "geoLocation" : [ -0.768937531935448, 52.0333793839746 ],
          "distance" : "20.0km"
        }
      }
    }
  },
  "sort" : [ {
    "_geo_distance" : {
      "geoLocation" : [ {
        "lat" : 52.0333793839746,
        "lon" : -0.768937531935448
      } ]
    }
  } ]
}

asc значение по умолчанию для сортировки, поэтому вы можете удалить order SortOrder.ASC, Просто хотел быть явным в этом примере.

Другие вопросы по тегам