Java-сущность не сопоставлена ​​со свойством ElasticSearch GeoPoint - PullRequest
0 голосов
/ 05 апреля 2019

Я разрабатываю микросервис для управления местоположениями с помощью Java / Spring Boot с использованием spring-data -asticsearch, и при попытке ввода новых данных в ES с помощью моего контроллера ввод данных не отображается должным образом в документ в ES, особенно в Атрибут Geopoint "местоположение".

Я пытался использовать GeoPoint из импорта org.springframework.data.elasticsearch.core.geo.GeoPoint и из org.springframework.data.elasticsearch.core.geo.GeoPoint, в обоих случаях данные, сохраненные в ES, не набираются как geo_point

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;

import io.swagger.annotations.ApiModelProperty;

@Document(indexName = "location", type="location")
public class Location {

    @Id
    @ApiModelProperty(hidden = true)
    private String id;

    private String appId;

    private String resourceId;

    @GeoPointField
    private GeoPoint location;

    private String street;

    private String city;

    // more attr and method was ommited

}

После сохранения данных в ES с использованием ElasticSearchRepository, когда я получаю данные отображения, отображается как:

{
  "location" : {
    "mappings" : {
      "location" : {
        "properties" : {
          "appId" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "city" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "country" : {
            "properties" : {
              "countryCcFips" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              },
              "countryCcIso" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              },
              "countryName" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              }
            }
          },
          "location" : {
            "properties" : {
              "lat" : {
                "type" : "float"
              },
              "lon" : {
                "type" : "float"
              }
            }
          },
          "parish" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
// ommited more json data

Пожалуйста, мне нужно, чтобы поле GeoPoint (местоположение) было привязано к geo_point в ES, важно для правильного выполнения Geoqueries.

Я использую Spring Data ElasticSearch с Spring Boot 2.1.3.RELEASE и драйвером ElasticSearch 6.4.3 с сервером ElasticSearch 6.4

1 Ответ

0 голосов
/ 08 апреля 2019

Я создал минимальное приложение с хранилищем, контроллером и запускаю его с 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, а не где-то еще?

А можете ли вы проверить отображение после приложения, запущенного, но за до какие-либо данные вставляются в индекс?

...