elasticsearch对地理坐标获取附近的城市

import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.geo.GeoDistance;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.GeoDistanceSortBuilder;
import org.elasticsearch.search.sort.SortOrder;

import java.math.BigDecimal;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import static org.elasticsearch.index.query.QueryBuilders.geoDistanceRangeQuery;

这里只是做个笔记,用elasticsearch获取附近的城市。
// 模糊查询
    public  void query(Client client,String query,String index,String type) throws Exception {
        QueryStringQueryBuilder qsqb = new QueryStringQueryBuilder(query);
        // qsqb.analyzer("ik").field("title");
        qsqb.field("title");
        client.admin().indices().prepareRefresh().execute().actionGet();

        SearchResponse searchResponse = client.prepareSearch(index).setTypes(type).setQuery(qsqb)
                // .setScroll(new TimeValue(60000))
                .addFields("id", "title", "updatetime")
                        // .addSort("updatetime", SortOrder.DESC)
                .addSort("_score", SortOrder.DESC)
                        // .addHighlightedField("title")
                .setHighlighterEncoder("UTF-8").execute().actionGet();
        // 搜索耗时
        Float usetime = searchResponse.getTookInMillis() / 1000f;
        // 命中记录数
        Long hits = searchResponse.getHits().totalHits();
        System.out.println("查询到记录数=" + hits);

        for (SearchHit hit : searchResponse.getHits()) {
            // 打分
            Float score = hit.getScore();
            Integer id = Integer.parseInt(hit.getFields().get("id").value().toString());
            String title = hit.getFields().get("title").value().toString();
            System.out.println(title);
        }
    }

    // 获取附近的城市
    public  void getNearbyCities(Client client, String index, String type, double lat, double lon) throws ExecutionException, InterruptedException {
        SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type);
        // srb.setPos
        // wx4g0th9p0gk 为北京的geohash 范围为lt(小于) 1500km内的数据
        QueryBuilder builder = geoDistanceRangeQuery("location")
                .point(lat,lon)//注意纬度在前,经度在后
                .from("0km")
                .to("10000km")
                .includeLower(true)
                .includeUpper(false)
                .optimizeBbox("memory")
                .geoDistance(GeoDistance.ARC);

        srb.setQuery(builder);
        // 获取距离多少公里 这个才是获取点与点之间的距离的
        //GeoDistanceSortBuilder sort = SortBuilders.geoDistanceSort("location");
        GeoDistanceSortBuilder sort = new GeoDistanceSortBuilder("location");
        sort.unit(DistanceUnit.KILOMETERS);//距离单位公里
        sort.order(SortOrder.ASC);
        sort.point(lat,lon);//注意纬度在前,经度在后

        srb.addSort(sort);
        SearchResponse searchResponse = srb.execute().actionGet();

        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHists = hits.getHits();
        System.out.println("北京附近的城市(" + hits.getTotalHits() + "个):");
        for (SearchHit hit : searchHists) {
            String city = (String) hit.getSource().get("city");
            String title = (String) hit.getSource().get("title");
            // 获取距离值,并保留两位小数点
            BigDecimal geoDis = new BigDecimal((Double) hit.getSortValues()[0]);
            Map<String, Object> hitMap = hit.getSource();
            // 在创建MAPPING的时候,属性名的不可为geoDistance。
            hitMap.put("geoDistance", geoDis.setScale(2, BigDecimal.ROUND_HALF_DOWN));
            System.out.println(city + "距离北京" + hit.getSource().get("geoDistance") + DistanceUnit.KILOMETERS.toString() + "---" + title);
        }
    }


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Soyoger

听说打赏的都进了福布斯排行榜。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值