一尘不染

通过Spring Data ElasticSearch将Spring Data JPA条目批量索引到Elastic

elasticsearch

我们当前的设置是通过Spring Data JPA将MySQL作为主要数据源,并使用Hibernate
Search索引和搜索数据。现在,我们决定去Elastic Search进行搜索,以更好地与其他功能保持一致,此外,我们需要让多个服务器共享索引和搜索。

我可以使用Spring Data
ElasticSearch来设置Elastic,以通过轻松进行数据索引和搜索ElasticsearchRepository。但是现在的挑战是如何将所有现有的MySQL记录索引到Elastic
Search中。Hibernate
Search提供了一个org.hibernate.search.jpa.FullTextEntityManager#createIndexer我们一直使用的API
。但是我在Spring Data ElasticSearch中找不到方便的解决方案。希望有人可以在这里帮助我或提供一些指示。

这里有一个类似的问题,但是那里提出的解决方案不能很好地满足我的需求,因为我希望能够为整个对象建立索引,这些对象的字段映射到多个数据库表。


阅读 1020

收藏
2020-06-22

共1个答案

一尘不染

到目前为止,我没有找到比编写自己的代码以将所有JPA条目索引到应用程序内的ES更好的解决方案了,这个对我来说很好

Pageable page = new PageRequest(0, 100);
Page<Instance> curPage = instanceManager.listInstancesByPage(page);    //Get data by page from JPA repo.
long count = curPage.getTotalElements();
while (!curPage.isLast()) {
    List<Instance> allInstances = curPage.getContent();
    for (Instance instance : allInstances) {
        instanceElasticSearchRepository.index(instance);    //Index one by one to ES repo.
    }
    page = curPage.nextPageable();
    curPage = instanceManager.listInstancesByPage(page);
}

逻辑非常简单,仅取决于可能要花费一段时间的数据量,因此分解成批并添加一些消息可能会有所帮助。

2020-06-22