0

Spring Data JPAがPostgresデータベースで設定されているSpring BootアプリケーションにEmbedded Elasticsearchを設定するのが初めてです。SpringブートJPA + SpringデータElasticSearch:elasticは結果を返しません。

私はElastic Search Springデータリポジトリのサポートを追加しました(または私は考えました)。問題は、ESA検索では何も返されない(JSON配列は空です)、JPAのものは正しく機能することです。

私は、今は毎回実行されるインデックスツールが必要だと読んでいますが、これに関連するものはSpring Data Elastic Searchドキュメントでは見つけられませんでした。

データベースからの検索結果を常にインデックスに登録する必要があることを正しく理解していますか?

@SpringBootApplication 
@EnableJpaRepositories(basePackages = "eu.deniss.repository") 
@ComponentScan 
public class SpringDataElasticsearchDemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(SpringDataElasticsearchDemoApplication.class, args); 
    } 
} 

人エンティティクラス:

@Entity 
@Document(indexName = "person", type = "person") 
public class Person { 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private String email; 
    private String gender; 
    private String ipAddress; 

    @Id 
    @org.springframework.data.annotation.Id 
    @Column(name = "id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
... 
} 

PersonSearchRepositoryクラス:

ここ

アプリケーションクラスです。このトピックBatch indexing Spring Data JPA entries to Elastic through Spring Data ElasticSearch唯一のソリューションで提供さ答えは

public interface PersonSearchRepository extends ElasticsearchRepository<Person, Long> { 
} 

PersonServiceImplクラス:

@Service 
public class PersonServiceImpl implements PersonService { 

    private final PersonRepository personRepository; 
    private final PersonSearchRepository personSearchRepository; 
    private final PersonMapper personMapper; 

    private static final Logger log = Logger.getLogger(PersonServiceImpl.class); 

    public PersonServiceImpl(PersonRepository personRepository, PersonSearchRepository personSearchRepository, PersonMapper personMapper) { 
     this.personRepository = personRepository; 
     this.personSearchRepository = personSearchRepository; 
     this.personMapper = personMapper; 
    } 

... 

    @Override 
    @Transactional(readOnly = true) 
    public Page<PersonDTO> search(String query, Pageable pageable) { 
     log.info("Request to search for a page of People with a query " + query); 
     Page<Person> result = personSearchRepository.search(queryStringQuery(query), pageable); 
     return result.map(person -> personMapper.personToPersonDTO(person)); 
    } 
} 

PersonControllerクラス:

@RestController() 
@RequestMapping("/api") 
public class PersonController { 

    private final PersonService personService; 
    private final Logger log = LoggerFactory.getLogger(PersonController.class); 
    private static final String ENTITY_NAME = "person"; 

    public PersonController(PersonService personService) { 
     this.personService = personService; 
    } 

    @GetMapping("/_search/people") 
    public ResponseEntity<List<PersonDTO>> searchPeople(@RequestParam String query, Pageable pageable) throws URISyntaxException { 
     log.info("REST request to search for a page of Appointments for query {} ", query); 
     Page<PersonDTO> page = personService.search(query, pageable); 
     HttpHeaders headers = PaginationUtil.generateSearchPaginationHttpHeaders(query, page, "/api/_search/people"); 
     return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); 
    } 
} 
+1

を使用することにより弾性検索に保存するのバッチジョブをしなければならなかった

がインデックス化されます。 '@ Document'を追加しても、何かをデータベースに保存するときに自動的にはそれが弾性に保存されるわけではありません。 –

+0

@ M.Deinumなので、バッチジョブを実行して、すべてのDBデータを読み込み、Elastic Searchに保存する必要がありますか? –

答えて

1

答えは非常に簡単でした。私は、データベースから現在のエンティティを照会して、弾性何には何も保存しない場合

personSearchRepository.save(person); 
関連する問題