【发布时间】:2017-10-15 17:06:14
【问题描述】:
所以,再回来
我有一个JHipster 生成的项目,它使用嵌入在spring boot 中的elasticsearch java 客户端。
我最近对数据集进行了一些重大更改,因为我们一直在从不同的存储库迁移大量新数据
在部署应用程序时一切正常,所有SearchRepositories 都加载没有问题,所有搜索功能都顺利进行
从测试环境运行时会出现问题。 application-test.yml 文件和 elasticsearch java 配置文件没有任何变化。
我们有一些更新索引的代码,我已经运行了几次,它似乎更新了 clusters indices 就好了,但我遇到的问题是在 target 文件夹中,它不会创建新索引
在测试模式下运行时,我无法进入目标文件夹的 12 个索引,但是,由于标题中提到的错误,其中只有 5 个在 ResourceIntTest 中失败
我不想用数百行不相关的代码来填充这篇文章,所以现在包含有助于测试不失败的解决方法就足够了:
当在 5 个失败的测试用例的 initTest 中时,如果我写下下面这行(显然在每个不同的情况下改变类名):
surveyDataQualitySearchRepository.save(surveyDataQualityRepository.findAll());
然后索引将自行创建,测试用例不会失败,但这不应该手动执行,应该在部署时调用IndexReinitializer 类中的resetIndex 方法时创建
重置索引:
@PostConstruct
public void resetIndex() {
long t = currentTimeMillis();
elasticsearchTemplate.deleteIndex("_all");
t = currentTimeMillis() - t;
logger.debug("ElasticSearch indexes reset in {} ms", t);
}
注释这段代码还允许加载所有索引,但不应注释它,因为它是索引的更新程序,而且它在仍指向旧版本的应用程序中运行良好数据集
非常欢迎所有帮助,我已经花了将近一整天的时间试图了解错误的来源,我也非常乐意上传任何可能与任何人相关的代码愿意在这里提供帮助。
编辑通过 cmets 请求为索引重建添加代码
@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);
}
【问题讨论】:
-
ES索引是与实体相关的,还是单独创建的?
resetIndex方法从嵌入式 elasticsearch 中删除所有索引(将数据存储在目标中) -
索引与域中的所有实体相关。我不完全理解嵌入式弹性搜索中发生的所有事情,所以我无法完全解释 resetIndex 是如何工作的,但我可以肯定的是,它不是索引没有自己创建的罪魁祸首,因为代码删除了所有索引,所以如果这是罪魁祸首,我不会只面对一些索引
-
我也有类似的问题。运行带有更新的 spring-data-es 在正常运行配置中运行良好,但在运行测试时不会创建索引。调试 es 客户端,我发现一个索引的两个映射已关闭。一个映射是我的,另一个我不知道它来自哪里。我的建议:如果你有一个解决方法,那就去做吧,让测试工作并继续前进,不值得花时间去弄清楚发生了什么。我损失了 2 天 :( 我认为唯一的其他选择是在一个简单的项目中重现错误并报告给 spring-data-es github 并链接您的测试存储库。
-
是的,我也有这样做的倾向,我在 SO 上有几个未解决的问题,我从未找到真正的解决方案,但在这个特定的问题上,我真的很愿意理解发生了什么,因为数据是我们应用程序的重要组成部分,如果这实际上意味着什么,我们基本上是数据驱动的组织。感谢您的评论!
-
鉴于问题来自在嵌入式实例中创建索引,也许共享创建“在目标文件夹中找不到”的索引的代码可能有助于理解您的问题。
标签: java elasticsearch jhipster spring-data-elasticsearch