所以,又回到了这里
我有一个由JHipster
生成的项目,该项目使用嵌入在spring boot
中的elasticsearch
java
客户端。
最近,由于我们正在从不同的存储库迁移一整批数据,我对数据集进行了一些重大更改
当部署应用程序时,一切正常,所有的SearchRepositories
都加载完毕,所有的搜索功能都运行顺畅
问题出现在测试环境下运行时。 application-test.yml
文件和elasticsearch
java配置文件都没有做任何更改。
我们有一些代码来更新索引,我已经运行了几次,它似乎可以很好地更新群集索引
,但我遇到的问题是在target
文件夹中,它就是无法创建新索引
在测试模式下运行时,我无法将其中的12个索引放入目标文件夹中,然而,只有其中5个因为标题中提到的错误而在它们的ResourceIntTest
中失败
我不想用数百行无关紧要的代码填充这篇文章,所以暂且只包括以下解决方法,可以帮助测试不失败:
当在5个失败的测试用例的initTest
中时,如果我写入以下行(显然,在每个不同的情况下更改类名):
surveyDataQualitySearchRepository.save(surveyDataQualityRepository.findAll());
然后索引将自行创建,测试用例将不会失败,但是这不应该手动操作,当在部署时调用IndexReinitializer
类中的resetIndex
方法时应该创建它。
resetIndex
:
@PostConstruct
public void resetIndex() {
long t = currentTimeMillis();
elasticsearchTemplate.deleteIndex("_all");
t = currentTimeMillis() - t;
logger.debug("ElasticSearch indexes reset in {} ms", t);
}
对于这段代码的注释,也可以加载所有的索引,但是不应该这样做,因为这个代码段可以作为索引的更新器,并且它在旧版本的应用程序中运行良好,而这些应用程序仍然指向旧数据集。
非常欢迎任何帮助,我已经花了将近一整天的时间来尝试了解错误的来源,如果有人愿意帮忙,我也非常乐意上传任何可能与此相关的代码片段。
编辑 根据评论的要求添加索引重建的代码。
@Test
public void synchronizeData() throws Exception{
resetIndex();
activePharmaIngredientSearchRepository.save(activePharmaIngredientRepository.findAll());
countrySearchRepository.save(countryRepository.findAll());
dosageUnitSearchRepository.save(dosageUnitRepository.findAll());
drugCategorySearchRepository.save(drugCategoryRepository.findAll());
drugQualityCategorySearchRepository.save(drugQualityCategoryRepository.findAll());
formulationSearchRepository.save(formulationRepository.findAll());
innDrugSearchRepository.save(innDrugRepository.findAll());
locationSearchRepository.save(locationRepository.findAll());
manufacturerSearchRepository.save(manufacturerRepository.findAll());
outletTypeSearchRepository.save(outletTypeRepository.findAll());
publicationSearchRepository.save(publicationRepository.findAll());
publicationTypeSearchRepository.save(publicationTypeRepository.findAll());
qualityReferenceSearchRepository.save(qualityReferenceRepository.findAll());
reportQualityAssessmentAssaySearchRepository.save(reportQualityAssessmentAssayRepository.findAll());
//rqaaQualitySearchRepository.save(rqaaQualityRepository.findAll());
rqaaTechniqueSearchRepository.save(rqaaTechniqueRepository.findAll());
samplingTypeSearchRepository.save(samplingTypeRepository.findAll());
//surveyDataQualitySearchRepository.save(surveyDataQualityRepository.findAll());
surveyDataSearchRepository.save(surveyDataRepository.findAll());
techniqueSearchRepository.save(techniqueRepository.findAll());
tradeDrugApiSearchRepository.save(tradeDrugApiRepository.findAll());
tradeDrugSearchRepository.save(tradeDrugRepository.findAll());
publicationDrugTypesSearchRepository.save(publicationDrugTypesRepository.findAll());
wrongApiSearchRepository.save(wrongApiRepository.findAll());
}
private void resetIndex() {
long t = currentTimeMillis();
elasticsearchTemplate.deleteIndex("_all");
t = currentTimeMillis() - t;
logger.debug("ElasticSearch indexes reset in {} ms", t);
}
resetIndex
方法会从嵌入式Elasticsearch(存储在目标中的数据)中删除所有索引。 - Jon Ruddell