美文网首页
springboot集成elasticsearch地理位置

springboot集成elasticsearch地理位置

作者: 爱的旋转体 | 来源:发表于2020-08-13 10:35 被阅读0次

项目简介:

  • 框架:springboot
  • 数据库:mysql
  • 持久层:jpa
  • 搜索引擎:elasticsearch

1 地理位置保存到mysql

mysql存储point类型地理位置,如何用jpa保存地理位置到mysql,请看https://www.jianshu.com/p/0a861e931531

2 保存到es

由于我们需要用es搜索,所以也需要将数据保存到es,地理位置保存有点问题,因为上面jpa保存到mysql的实体类里的point类型不适用es,所以需要自定义转换器https://docs.spring.io/spring-data/elasticsearch/docs/4.0.3.RELEASE/reference/html/#elasticsearch.mapping.meta-model.conversions

package com.xzp.config;

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;

import org.elasticsearch.client.RestHighLevelClient;
import org.geolatte.geom.G2D;
import org.geolatte.geom.Point;
import org.geolatte.geom.crs.CrsRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions;
import org.springframework.util.NumberUtils;

/**
 * @author xzp
 * @date 2020-08-12 13:07:06
 */
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    @Autowired
    @Qualifier("elasticsearchRestHighLevelClient")
    private RestHighLevelClient elasticsearchRestHighLevelClient;

    @Override
    public RestHighLevelClient elasticsearchClient() {
        return elasticsearchRestHighLevelClient;
    }

      // 主要看下面的代码

    @Bean
    @Override
    public ElasticsearchCustomConversions elasticsearchCustomConversions() {
        return new ElasticsearchCustomConversions(Arrays.asList(PointToMapConverter.INSTANCE,MapToPointConverter.INSTANCE));
    }
    
    @WritingConverter
    @SuppressWarnings("rawtypes")
    enum PointToMapConverter implements Converter<Point, Map<String, Object>> {

        INSTANCE;

        @Override
        public Map<String, Object> convert(Point source) {
            if (source == null)
                return null;
            LinkedHashMap<String, Object> target = new LinkedHashMap<>();
            target.put("lat", source.getPosition().getCoordinate(1));
            target.put("lon", source.getPosition().getCoordinate(0));
            return target;
        }
    }
    
    @ReadingConverter
    @SuppressWarnings({ "rawtypes", "unchecked" })
    enum MapToPointConverter implements Converter<Map<String, Object>, Point> {

        INSTANCE;

        @Override
        public Point convert(Map<String, Object> source) {
            Double lat = NumberUtils.convertNumberToTargetClass((Number) source.get("lat"), Double.class);
            Double lon = NumberUtils.convertNumberToTargetClass((Number) source.get("lon"), Double.class);
            return new Point(new G2D(lon, lat),CrsRegistry.getCoordinateReferenceSystemForEPSG(4326, null));
        }
    }

    // no special bean creation needed
}

参考的是elasticsearch自带的GeoConverters的写法

/*
 * Copyright 2019-2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.data.elasticsearch.core.convert;

import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.geo.Point;
import org.springframework.util.NumberUtils;

/**
 * Set of {@link Converter converters} specific to Elasticsearch Geo types.
 *
 * @author Christoph Strobl
 * @author Peter-Josef Meisch
 * @since 3.2
 */
class GeoConverters {

    static Collection<Converter<?, ?>> getConvertersToRegister() {

        return Arrays.asList(PointToMapConverter.INSTANCE, MapToPointConverter.INSTANCE, GeoPointToMapConverter.INSTANCE,
                MapToGeoPointConverter.INSTANCE);
    }

    /**
     * {@link Converter} to write a {@link Point} to {@link Map} using {@code lat/long} properties.
     */
    @WritingConverter
    enum PointToMapConverter implements Converter<Point, Map<String, Object>> {

        INSTANCE;

        @Override
        public Map<String, Object> convert(Point source) {

            Map<String, Object> target = new LinkedHashMap<>();
            target.put("lat", source.getX());
            target.put("lon", source.getY());
            return target;
        }
    }

    /**
     * {@link Converter} to write a {@link GeoPoint} to {@link Map} using {@code lat/long} properties.
     */
    @WritingConverter
    enum GeoPointToMapConverter implements Converter<GeoPoint, Map<String, Object>> {

        INSTANCE;

        @Override
        public Map<String, Object> convert(GeoPoint source) {
            Map<String, Object> target = new LinkedHashMap<>();
            target.put("lat", source.getLat());
            target.put("lon", source.getLon());
            return target;
        }
    }

    /**
     * {@link Converter} to read a {@link Point} from {@link Map} using {@code lat/long} properties.
     */
    @ReadingConverter
    enum MapToPointConverter implements Converter<Map<String, Object>, Point> {

        INSTANCE;

        @Override
        public Point convert(Map<String, Object> source) {
            Double x = NumberUtils.convertNumberToTargetClass((Number) source.get("lat"), Double.class);
            Double y = NumberUtils.convertNumberToTargetClass((Number) source.get("lon"), Double.class);

            return new Point(x, y);
        }
    }

    /**
     * {@link Converter} to read a {@link GeoPoint} from {@link Map} using {@code lat/long} properties.
     */
    @ReadingConverter
    enum MapToGeoPointConverter implements Converter<Map<String, Object>, GeoPoint> {

        INSTANCE;

        @Override
        public GeoPoint convert(Map<String, Object> source) {
            Double x = NumberUtils.convertNumberToTargetClass((Number) source.get("lat"), Double.class);
            Double y = NumberUtils.convertNumberToTargetClass((Number) source.get("lon"), Double.class);

            return new GeoPoint(x, y);
        }
    }
}

相关文章

网友评论

      本文标题:springboot集成elasticsearch地理位置

      本文链接:https://www.haomeiwen.com/subject/qnhbdktx.html