Я создал минимальное приложение с хранилищем, контроллером и запускаю его с Spring Boot 2.1.3.RELEASE, Spring Data Elasticsearch 3.1.5.RELEASE, клиентasticsearch 6.4.3 и сервер Elasticsearch 6.4.0.
Я использую класс Person
pojo, который имеет два поля geo_point, одно - обычная пружина GeoPoint
, а другое - пользовательский MyGeoPoint
, использующий аннотацию GeoPointField
.
После запуска приложения и вставки записи с помощью метода init
RestController, отображение в индексе в порядке:
{
"person": {
"aliases": {},
"mappings": {
"person": {
"properties": {
"firstName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"geoPoint": {
"type": "geo_point"
},
"id": {
"type": "long"
},
"lastName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"myGeoPoint": {
"type": "geo_point"
}
}
}
},
"settings": {
"index": {
"refresh_interval": "1s",
"number_of_shards": "5",
"provided_name": "person",
"creation_date": "1554750620775",
"store": {
"type": "fs"
},
"number_of_replicas": "1",
"uuid": "w1L279wOQUmvDPMu4iYXtg",
"version": {
"created": "6040099"
}
}
}
}
}
Person.java
/*
* (c) Copyright 2019 sothawo
*/
package com.sothawo.springdataelastictest;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
/**
* @author P.J. Meisch (pj.meisch@sothawo.com)
*/
@Document(indexName = "person", type = "person")
public class Person {
@Id private Long id;
private String lastName;
private String firstName;
private GeoPoint geoPoint;
@GeoPointField private MyGeoPoint myGeoPoint;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public GeoPoint getGeoPoint() {
return geoPoint;
}
public void setGeoPoint(GeoPoint geoPoint) {
this.geoPoint = geoPoint;
}
public MyGeoPoint getMyGeoPoint() {
return myGeoPoint;
}
public void setMyGeoPoint(MyGeoPoint myGeoPoint) {
this.myGeoPoint = myGeoPoint;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", firstName='" + firstName + '\'' +
", geoPoint=" + geoPoint +
", myGeoPoint=" + myGeoPoint +
'}';
}
public static class MyGeoPoint {
private double lat;
private double 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;
}
@Override
public String toString() {
return "MyGeoPoint{" + "lat=" + lat + ", lon=" + lon + '}';
}
}
}
PersonRepository.java
package com.sothawo.springdataelastictest;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface PersonRepository extends ElasticsearchRepository<Person, Long> {}
ElasticsearchRepositoryController.java :
package com.sothawo.springdataelastictest;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/repo")
public class ElasticsearchRepositoryController {
private PersonRepository personRepository;
public ElasticsearchRepositoryController(PersonRepository personRepository) {
this.personRepository = personRepository;
}
@GetMapping("/init")
public Long initPerson() {
final Person person = new Person();
person.setId(42L);
person.setFirstName("John");
person.setLastName("Doe");
GeoPoint geoPoint = new GeoPoint(12.34, 56.78);
person.setGeoPoint(geoPoint);
Person.MyGeoPoint myGeoPoint = new Person.MyGeoPoint();
myGeoPoint.setLat(43.21);
myGeoPoint.setLon(87.65);
person.setMyGeoPoint(myGeoPoint);
return personRepository.save(person).getId();
}
}
SpringdataElasticTestApplication.java
package com.sothawo.springdataelastictest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
@SpringBootApplication
@EnableElasticsearchRepositories
public class SpringdataElasticTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringdataElasticTestApplication.class, args);
}
}
Так что я не могу найти проблему с этим кодом и версиями, которые я использовал. Можете ли вы воспроизвести ошибку с этими классами или построить минимальный пример, который воспроизводит ошибку?
Вы уверены, что сопоставление создано классом Repository, а не где-то еще?
А можете ли вы проверить отображение после приложения, запущенного, но за до какие-либо данные вставляются в индекс?