索引未找到异常

8

所以,又回到了这里

我有一个由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);
    }

1
ES索引与实体相关联,还是单独创建的?resetIndex方法会从嵌入式Elasticsearch(存储在目标中的数据)中删除所有索引。 - Jon Ruddell
2
我有一个类似的问题。在正常运行配置下,使用更新的spring-data-es可以正常工作,但在运行测试时不会创建索引。调试es客户端后,我发现了一个索引的两个映射是错误的。其中一个映射是我的,另一个我不知道它来自哪里。我的建议是:如果你有一个解决方法,就用它,让测试工作并继续前进,不值得花时间去弄清楚发生了什么。我浪费了像2天的时间:( 我认为唯一的其他选择是在一个简单的项目中重现错误,并报告给spring-data-es github并链接你的测试repo。 - Tim Schimandle
是的,我也有这种倾向,我的一些SO上的问题从来没有找到真正的解决方案,但在这个特定的问题上,我真的很想了解发生了什么,因为数据是我们应用程序的重要组成部分,如果实际上有任何意义,我们基本上是数据驱动型组织。谢谢你的评论! - Steven
鉴于您的嵌入式实例中索引的创建存在问题,也许分享创建“未在目标文件夹中找到”的索引的代码可以帮助理解您的问题。 - Adonis
@asettouf 完成了! - Steven
显示剩余2条评论
1个回答

4
请尝试更新到最新版本的spring-data-elasticsearch。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接