java 汽车搜索更多_Elasticsearch 之(52) Java API 基于geo point地理位置对周围汽车4S店进行搜索...

本文介绍如何使用Elasticsearch进行地理定位查询,包括基于矩形范围、多边形范围及固定距离范围内的4S店搜索。

比如我们有很多的4s店,然后呢给了用户一个app,在某个地方的时候,可以根据当前的地理位置搜索一下,自己附近的4s店

pom 文件引入

org.locationtech.spatial4j

spatial4j

0.6

com.vividsolutions

jts

1.13

xerces

xercesImpl

mapping

POST /car_shop/_mapping/shops

{

"properties": {

"pin": {

"properties": {

"location": {

"type": "geo_point"

}

}

}

}

}初始化数据

PUT /car_shop/shops/1

{

"name": "上海至全宝马4S店",

"pin" : {

"location" : {

"lat" : 40.12,

"lon" : -71.34

}

}

}

PUT /car_shop/shops/2

{

"name": "上海顺风宝马4S店",

"pin" : {

"location" : {

"lat" : 40.12,

"lon" : -71.34

}

}

}

查询一定数量坐标点组成的范围内的4S店,以及一定距离内的4S店

package com.es.app;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.client.transport.TransportClient;

import org.elasticsearch.common.geo.GeoPoint;

import org.elasticsearch.common.settings.Settings;

import org.elasticsearch.common.transport.InetSocketTransportAddress;

import org.elasticsearch.common.unit.DistanceUnit;

import org.elasticsearch.index.query.QueryBuilders;

import org.elasticsearch.search.SearchHit;

import org.elasticsearch.transport.client.PreBuiltTransportClient;

import java.net.InetAddress;

import java.util.ArrayList;

import java.util.List;

public class GeoLocationShopSearchApp {

@SuppressWarnings({ "resource", "unchecked" })

public static void main(String[] args) throws Exception {

Settings settings = Settings.builder()

.put("cluster.name", "elasticsearch")

.build();

TransportClient client = new PreBuiltTransportClient(settings)

.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

//第一个需求:搜索两个坐标点组成的一个区域

SearchResponse searchResponse = client.prepareSearch("car_shop")

.setTypes("shops")

.setQuery(QueryBuilders.geoBoundingBoxQuery("pin.location")

.setCorners(40.73, -74.1, 40.01, -71.12))

.get();

for(SearchHit searchHit : searchResponse.getHits().getHits()) {

System.out.println(searchHit.getSourceAsString());

}

System.out.println("====================================================");

//第二个需求:指定一个区域,由三个坐标点,组成,比如上海大厦,东方明珠塔,上海火车站

List points = new ArrayList<>();

points.add(new GeoPoint(40.73, -74.1));

points.add(new GeoPoint(40.01, -71.12));

points.add(new GeoPoint(50.56, -90.58));

searchResponse = client.prepareSearch("car_shop")

.setTypes("shops")

.setQuery(QueryBuilders.geoPolygonQuery("pin.location", points))

.get();

for(SearchHit searchHit : searchResponse.getHits().getHits()) {

System.out.println(searchHit.getSourceAsString());

}

System.out.println("====================================================");

//第三个需求:搜索距离当前位置在200公里内的4s店

searchResponse = client.prepareSearch("car_shop")

.setTypes("shops")

.setQuery(QueryBuilders.geoDistanceQuery("pin.location")

.point(40, -70)

.distance(200, DistanceUnit.KILOMETERS))

.get();

for(SearchHit searchHit : searchResponse.getHits().getHits()) {

System.out.println(searchHit.getSourceAsString());

}

client.close();

}

}

相关es restful api 可以参考:

《Elasticsearch 之(39)引入geo point地理位置数据类型_矩形范围查询》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值