<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import java.math.BigDecimal;
/***
* */
@Document(indexName = "test_recomment_202402",type = "test_type")
@Data
public class HomePageRecomment {
@Id
private Long id;
@GeoPointField()
private GeoPoint location;
private BigDecimal distance;
}
@RestController
public class RecommendTestController {
@Autowired
private TransportClient transportClient;
/**
* 按照距离排序,并计算距离
* */
@RequestMapping("test/distanceOrder")
public List<Object> distanceOrder() {
double lat = 30.3129083;
double lon = 120.123456;
SearchRequestBuilder srb = transportClient.prepareSearch("test_recomment_202402").setTypes("test_type");
//页码 和 页大小
srb.setFrom(1).setSize(100);
//距离排序,查询结果中获取排序的值,就是距离
GeoDistanceSortBuilder sort = SortBuilders.geoDistanceSort("location",lat,lon);
sort.unit(DistanceUnit.METERS);
sort.order(SortOrder.ASC);
sort.geoDistance(GeoDistance.PLANE);
srb.addSort(sort);
SearchResponse searchResponse = srb.execute().actionGet();
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHists = hits.getHits();
List<Object> results = new ArrayList<>();
for (SearchHit hit : searchHists) {
HomePageRecomment bean = JSON.parseObject(hit.getSourceAsString(),HomePageRecomment.class);
//获取结果中返回的距离
BigDecimal geoDis = new BigDecimal((Double) hit.getSortValues()[0]);
bean.setDistance(geoDis.setScale(0, BigDecimal.ROUND_HALF_DOWN));
results.add(bean);
}
return results;
}
}