elasticsearch:附近的店铺距离排序-爱代码爱编程
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
@Configuration
public class ElasticsearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
return new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.150.101:9200")
));
}
}
@Data
public class Demo{
// 用于附近店铺,得到排序信息
private Object distance;
}
@Data
public class RequestParams {
private Integer page;
private Integer size;
// location的格式为 "经度,纬度“
private String location;
}
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
@Slf4j
@Service
public class DemoService extends ServiceImpl<DemoMapper, Demo> implements IDemoService {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Override
public PageResult search(RequestParams params) {
try {
// 1.准备Request
SearchRequest request = new SearchRequest("demo");
// 2.准备请求参数
// 2.1.分页
int page = params.getPage();
int size = params.getSize();
request.source().from((page - 1) * size).size(size);
// ==============================================================
// 2.2.距离排序
String location = params.getLocation();
if (StringUtils.isNotBlank(location)) {
request.source().sort(SortBuilders
// "location" es中的参数
.geoDistanceSort("location", new GeoPoint(location))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS)
);
}
// ==============================================================
// 3.发送请求
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 4.解析响应
return handleResponse(response);
} catch (IOException e) {
throw new RuntimeException("搜索数据失败", e);
}
}
private PageResult handleResponse(SearchResponse response) {
SearchHits searchHits = response.getHits();
// 4.1.总条数
long total = searchHits.getTotalHits().value;
// 4.2.获取文档数组
SearchHit[] hits = searchHits.getHits();
// 4.3.遍历
List<Demo> demoList = new ArrayList<>(hits.length);
for (SearchHit hit : hits) {
// 4.4.获取source
String json = hit.getSourceAsString();
// 4.5.反序列化,非高亮的
Demo demo= JSON.parseObject(json, Demo.class);
// =======================================================
// 4.6.排序信息
Object[] sortValues = hit.getSortValues();
if (sortValues.length > 0) {
demo.setDistance(sortValues[0]);
}
// =======================================================
// 4.7.放入集合
demoList.add(demo);
}
return new PageResult(total, hotels);
}
}