我们当前的设置是通过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中找不到方便的解决方案。希望有人可以在这里帮助我或提供一些指示。
ElasticsearchRepository
org.hibernate.search.jpa.FullTextEntityManager#createIndexer
这里有一个类似的问题,但是那里提出的解决方案不能很好地满足我的需求,因为我希望能够为整个对象建立索引,这些对象的字段映射到多个数据库表。
到目前为止,我没有找到比编写自己的代码以将所有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); }
逻辑非常简单,仅取决于可能要花费一段时间的数据量,因此分解成批并添加一些消息可能会有所帮助。