Я создал индекс (дом) с типом «квартиры», который содержит 20 документов. Я загрузил Json в виде двоичного файла вasticsearch с помощью почтальона. У меня есть проект Spring Boot, который имеет следующие классы:
EsConfig.java - Я настроил имя кластера, которое является именем по умолчанию в файле application.properties.
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.search.repository")
public class EsConfig {
@Value("${elasticsearch.clustername}")
private String EsClusterName;
@Bean
public Client esClient() throws UnknownHostException {
Settings esSettings = Settings.builder()
.put("cluster.name", EsClusterName)
.put("client.transport.sniff", true)
.put("client.transport.ignore_cluster_name", false)
.build();
TransportClient client = new PreBuiltTransportClient(esSettings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
return client;
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() throws Exception{
return new ElasticsearchTemplate(esClient());
}
}
Apartments.java - Это моя модель данных. Документы имеют следующие поля вasticsearch.
@Document(indexName = "house", type = "apartments")
@JsonIgnoreProperties(ignoreUnknown=true)
public class Apartments {
@Id
private String id;
@JsonProperty("Apartment_Name")
private String apartmentName;
@JsonProperty("Apartment_ID")
private String apartmentId;
@JsonProperty("Area_Name")
private String areaName;
//constructors along with getters and setters
}
ApartmentSearchRepository.java - это интерфейс, расширяющий интерфейс ElasticsearchRepository для выполнения операций crud.
public interface ApartmentSearchRepository extends ElasticsearchRepository<Apartments, String> {
List<Apartments> findByApartmentName(String apartmentName);
}
EsApartmentService.java -
@Service
public class EsApartmentService {
@Autowired
ApartmentSearchRepository apartmentSearchRepository;
public List<Apartments> getApartmentByName(String apartmentName) {
return apartmentSearchRepository.findByApartmentName(apartmentName);
}
}
ApartmentController.java - Я создал конечную точку, которая должна возвращать эти 20 документов изasticsearch. (Кроме того, Apartment - это POJO в моем проекте, а Apartments - модель данных.)
@Autowired
EsApartmentService esApartmentService;
@GetMapping(path = "/search",produces = "application/json")
public Set<Apartment> searchApartmentByName(
@RequestParam(value = "apartmentName", defaultValue = "") String apartmentName) throws IOException {
List<Apartment> apartments= new ArrayList<>();
esApartmentService.getApartmentByName(apartmentName).forEach(apartment-> {
apartments.add(new Apartment(apartment.getApartmentName(), apartment.getApartmentId(), apartment.getAreaName()));
});
return apartments.stream()
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Apartment::getApartmentId))));
}
Этот код возвращает статус 200, но с пустым ответом. Я попытался отладить, но кажется, что он не может прочитать эти документы из эластичного поиска. Я прошел через несколько решений, но большинство из них установили данные документа в самом коде.
Я не могу получить эти документы, нажав конечную точку, указанную в контроллере. Может ли кто-нибудь дать мне знать, что я могу упустить? Спасибо! :)
Редактировать: На снимке экрана ниже показаны запрос и ответ в Почтальоне.