elasticsearch 地理查询的使用(二)

elasticsearch5.6.16与springboot的整合使用(主要是9300端口)

当前使用的elasticsearch版本是5.6.16版本springboot的版本主要是2.0.9.RELEASE稳定版,详细的maven依赖参考如下

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--elasticsearch-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.6.16</version>
        </dependency>
        <dependency>
            <groupId>org.locationtech.spatial4j</groupId>
            <artifactId>spatial4j</artifactId>
            <version>0.6</version>
        </dependency>
        <dependency>
            <groupId>com.vividsolutions</groupId>
            <artifactId>jts</artifactId>
            <version>1.13</version>
            <exclusions>
                <exclusion>
                    <groupId>xerces</groupId>
                    <artifactId>xercesImpl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--devtools热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>
    </dependencies>

写一个elasticsearch的配置类
@Configuration
public class ElasticSearchConfig {
    private static final Logger logger = LoggerFactory.getLogger(ElasticSearchConfig.class);

    @Value("${elasticsearch.ip}")
    private String hostName;

    @Value("${elasticsearch.port}")
    private String port;

    @Value("${elasticsearch.cluster.name}")
    private String clusterName;

    @Value("${elasticsearch.pool}")
    private String poolSize;

    @Bean
    public TransportClient transportClient()  {

        logger.info("Elasticsearch begin to init ");
        TransportClient transportClient = null;
        try {
            // 地址信息
            InetSocketTransportAddress transportAddress = new InetSocketTransportAddress(
                    InetAddress.getByName(hostName), Integer.valueOf(port));

            // 配置信息
            Settings esSetting = Settings.builder().put("cluster.name", clusterName) // 集群名字
                    .put("client.transport.sniff", true)// 增加嗅探机制,找到ES集群
                    .put("thread_pool.search.size", Integer.parseInt(poolSize))// 线程池个数
                    .put("client.transport.ping_timeout","120s")// 超时时间
                    .build();

            // 配置信息Settings自定义
            transportClient = new PreBuiltTransportClient(esSetting);
            transportClient.addTransportAddresses(transportAddress);
        } catch (Exception e) {
            logger.error("TransportClient create error", e);
        }
        return transportClient;
    }
}
连接elasticsearch的yml配置
# Elasticsearch
#9200端口是RESTFul API来访问ElasticSearch的端口,9300端口是es节点通讯的默认端口,给java程序用的配置9300
elasticsearch:
  ip: 127.0.0.1
  port: 9300
  pool: 5
  cluster:
        name: elasticsearch(在本机安转后访问localhost:9200端口查看cluster的名字)
简单一点的elasticsearch的操作(新增索引,索引一条数据,DSLQUery,聚合的简单操作)
@RestController
public class EsController {
    @Autowired
    private TransportClient transportClient;

    /**
     * 测试elasticsearch Get的查询
     * @param id
     * @return
     */
    @GetMapping("/customer/person/{id}")
    public Map<String, Object> getIndexById(@PathVariable("id") String id){
        // System.out.println("transportClient = " + transportClient);
        GetResponse response = transportClient.prepareGet("customer", "person", id).get();
        Map<String, Object> source = response.getSource();
        return source;
    }

    @GetMapping("/customer/person/add")
    public String add() throws IOException {
        User user=new User("zpj",18,"男","hunandaxue");
        XContentBuilder xContentBuilder= XContentFactory.jsonBuilder()
                .startObject()
                .field("name",user.getName())
                .field("age",user.getAge())
                .field("sex",user.getSex())
                .field("school",user.getSchool())
                .endObject();
        IndexResponse indexResponse = transportClient.prepareIndex("customer", "person").setSource(xContentBuilder).get();
        return "success";
    }
    @GetMapping("/customer/person")
    public String del(@RequestParam("id") String id){
        transportClient.prepareDelete("customer","person",id).get();

        return "success";
    }
    @GetMapping("/customer/person/update")
    public String update(@RequestParam("id2") String id2) throws ExecutionException, InterruptedException, IOException {
        System.out.println("id2 = " + id2);
        UpdateRequest updateRequest=new UpdateRequest("customer","person",id2);

        XContentBuilder xContentBuilder=XContentFactory.jsonBuilder()
                .startObject()
                .field("name","zpjyyyy")
                .endObject();
        updateRequest.doc(xContentBuilder);
        transportClient.update(updateRequest).get();
        return "success";
    }
    @GetMapping("/blank/search")
    public List<Object> query() throws ExecutionException, InterruptedException {
        // 构建query语句
        QueryBuilder queryBuilder=new MatchQueryBuilder("address","mill");
        // 构建agg聚合语句
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age");
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        ageAgg.subAggregation(balanceAvg);
        // 通过transportClient执行上述构建的语句
        SearchResponse searchResponse = transportClient.prepareSearch()
                .setQuery(queryBuilder)
                .addAggregation(ageAgg)
                // .addAggregation(balanceAvg)
                .execute().actionGet();
        List<Object> list=new ArrayList();
        // 获取到查询出来的数据Hitis为query语句查询出来的数据
        Iterator<SearchHit> iterator = searchResponse.getHits().iterator();
        // 使用迭代器进行遍历
        while (iterator.hasNext()){
            // 拿出每一个数据
            SearchHit next = iterator.next();
            // 存到准备好的list集合中
            list.add(next.getSource());
        }
        // 获取到agg语句查询出来的部分
        Terms ageAggTerms = (Terms) searchResponse.getAggregations().asMap().get("ageAgg");
        Iterator<? extends Terms.Bucket> iteratorAge = ageAggTerms.getBuckets().iterator();
        while (iteratorAge.hasNext()){
            Terms.Bucket next = iteratorAge.next();
            InternalAvg internalAvg = (InternalAvg) next.getAggregations().asMap().get("balanceAvg");
            list.add(internalAvg.getName()+" : "+internalAvg.getValue());
        }
        return list;
    }
}
使用elasticsearch进行地理查询的复杂操作(DLSQuery,聚合,地理查询函数的使用)

主要使用的geo_point类型的数据

@RestController
public class CityController {

    @Autowired
    private TransportClient transportClient;
    @GetMapping("/useGeoDistance")
    public List<Object> UseGeoDistance(){
        GeoPoint geoPoint=new GeoPoint();
        geoPoint.reset(24.46667, 118.10000);
        // 构造一个distance距离聚合查询在离厦门300km-800km的城市个数
        GeoDistanceAggregationBuilder geoAgg=AggregationBuilders.geoDistance("distanceAgg", geoPoint)
                .field("location")
                .unit(DistanceUnit.KILOMETERS)
                .addRange(300.00,800.00);
        GeoDistanceSortBuilder sort = SortBuilders.geoDistanceSort("location", 24.46667, 118.10000)
                .order(SortOrder.DESC);// 按照距离location点距离进行倒序排序
        QueryBuilder qbFilter = geoDistanceQuery("location") // 点的名字
                .point(24.46667, 118.10000)// 点的位置
                .distance(800, DistanceUnit.KILOMETERS);// 距离当前点的距离
        QueryBuilder boolQuery=new BoolQueryBuilder()
                .must(new MatchAllQueryBuilder())// 添加必须满足匹配全部被
                .filter(qbFilter);// 添加filter部分语句
        SearchResponse searchResponse = transportClient.prepareSearch()
                .setQuery(boolQuery)
                .addSort(sort)
                .addAggregation(geoAgg)
                .get();// 发送search请求并获取返回的数据
        List<Object> list=new ArrayList<>();
        Iterator<SearchHit> iterator = searchResponse.getHits().iterator();
        while (iterator.hasNext()){
            SearchHit next = iterator.next();
            Map<String, Object> source = next.getSource();
            list.add(source);

        }
        Aggregation distanceAgg = searchResponse.getAggregations().get("distanceAgg");
       // Map<String, Object> metaData = distanceAgg.getMetaData();
        list.add(distanceAgg);
        return list;

    }


}

后续是geo_shape的操作

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

麦片王子

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值