Search code examples
javaelasticsearchspring-data-elasticsearchgeopointselasticsearch-java-api

Unable to index GeoPoints in ElasticSearch 1.7.3 with Java API


My Class

package be.smartask.data;

import be.smartask.core.api.Language;
import org.elasticsearch.common.geo.GeoPoint;

import java.util.Date;
import java.util.Map;

/**
 * @author Glenn Van Schil
 *         Created on 26/01/2016
 */
public class CityValue extends Value {
    private int radius;
    private Map<Language, String> translations;
    private GeoPoint geoPoint;
    private Suggest suggest;

    public CityValue() {
    }

    public CityValue(Date createdOn, String id, Date lastUpdatedOn, String fieldId, String projectId, String userId, GeoPoint geoPoint, int radius, Suggest suggest, Map<Language, String> translations) {
        super(createdOn, id, lastUpdatedOn, fieldId, projectId, userId);
        this.geoPoint = geoPoint;
        this.radius = radius;
        this.suggest = suggest;
        this.translations = translations;
    }

    public GeoPoint getGeoPoint() {
        return geoPoint;
    }

    public void setGeoPoint(GeoPoint geoPoint) {
        this.geoPoint = geoPoint;
    }

    public void setGeoPoint(double lat, double lon) {
        this.geoPoint = new GeoPoint(lat, lon);
    }

    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    public Suggest getSuggest() {
        return suggest;
    }

    public void setSuggest(Suggest suggest) {
        this.suggest = suggest;
    }

    public Map<Language, String> getTranslations() {
        return translations;
    }

    public void setTranslations(Map<Language, String> translations) {
        this.translations = translations;
    }
}

My Mapping

{
    "cityvalue": {
        "dynamic_templates": [{
            "notanalyzed": {
                "match": "*",
                "match_mapping_type": "string",
                "mapping": {
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }],
        "properties": {
            "createdOn": {
                "type": "date",
                "format": "date_hour_minute_second"
            },
            "lastUpdatedOn": {
                "type": "date",
                "format": "date_hour_minute_second"
            },
            "suggest": {
                "type": "completion",
                "preserve_separators": false,
                "index_analyzer": "simple",
                "search_analyzer": "simple",
                "payloads": false
            },
            "geoPoint": {
                "type": "geo_point"
            }
        }
    }
}

When I try to index this object I get the following error

org.elasticsearch.ElasticsearchParseException: field must be either lat/lon or geohash

Why is this error thrown and how can I solve this?

I've always used Spring-data to interact with Elastic which also had a GeoPoint object and it worked fine with the same mapping but because I removed Spring-data I had to switch from org.springframework.data.elasticsearch.core.geo.GeoPoint to org.elasticsearch.common.geo.GeoPoint


Solution

  • I solved this by not using the Elastic GeoPoint object. I created the following object and replaced all the usages of Elastic's GeoPoint with my object.

    package be.smartask.core.api.data;
    
    /**
     * @author Glenn Van Schil
     *         Created on 20/04/2016
     */
    public class GeoPoint {
        double lat, lon;
    
        public GeoPoint() {
        }
    
        public GeoPoint(double lat, double lon) {
            this.lat = lat;
            this.lon = lon;
        }
    
        public double getLat() {
            return lat;
        }
    
        public void setLat(double lat) {
            this.lat = lat;
        }
    
        public double getLon() {
            return lon;
        }
    
        public void setLon(double lon) {
            this.lon = lon;
        }
    }
    

    My mapping is unchanged.