0

我将 SolrCrudRepository 用于所有 CRUD 操作。它应该在调用 SolrCrudRepository 的 save() 方法时保存并提交,但这不是它正在做的事情。我需要使用 SolrTemplate 的 commit() 方法来完全保存(例如保存和提交)文档。如果我删除该行solrTemplateThree.getSolrServer().commit(),那么它将不会提交。因此我无法查询数据(需要直接从 solr 管理页面重新加载核心然后查询)。欢迎任何关于可能原因的指示或评论。

除了 SolrCrudRepository 之外,还有哪些其他替代方法可用于保存/删除 solr 索引?

@Service("solrDocumentService")
@Repository
public class SolrDocumentServiceImpl implements SolrDocumentService{

    private static final Logger logger = LoggerFactory.getLogger(SolrDocumentServiceImpl.class);

    @Autowired @Qualifier("solrTemplateThree")
    private SolrTemplate solrTemplateThree;

    @Override
    public SolrDocument save(SolrDocument solrDoc) {
        SolrDocument saved = solrDocumentRepository().save(solrDoc);
        try {
            solrTemplateThree.getSolrServer().commit();
        } catch (SolrServerException e) {
            logger.info(e.getMessage());
        } catch (IOException e) {
            logger.info(e.getMessage());
        }

        return saved;
    }


    private SolrDocumentRepository solrDocumentRepository(){
        return new SolrRepositoryFactory(solrTemplateThree).getRepository(SolrDocumentRepository.class);
    }

}

配置类

@Configuration
@EnableSolrRepositories("repository")
@ComponentScan(basePackages={"..."})
//@Profile("production")
@PropertySource("classpath:solr.properties")
public class HttpSolrConfig {

    @Autowired
    private Environment environment;

    @Bean
    public HttpSolrServerFactoryBean solrServerFactoryBeanAutocomplete() {
        HttpSolrServerFactoryBean factory = new HttpSolrServerFactoryBean();
        factory.setUrl(environment.getRequiredProperty("solr.server.core.three.url"));
        return factory;
    }

    @Bean
    public SolrTemplate solrTemplateThree() throws Exception {
        return new SolrTemplate(solrServerFactoryBeanAutocomplete().getObject());
    }

    @Bean
    public SolrTemplate solrTemplate() throws Exception {
        return new SolrTemplate(solrServerFactoryBeanUsers().getObject());
    }

}
4

2 回答 2

2

当您在 Solr 中为文档建立索引时,它在提交到索引之前将无法用于搜索。这就是为什么您必须调用该.commit()方法(或重新加载核心)才能在查询时看到此文档。

但是,最近有一个问题DATASOLR-107 添加了 commitWithin Support,它向方法(以及其他一些参数)添加了一个附加参数,.save()允许您以毫秒为单位指定提交文档之前的时间。更改您的代码如下:

更新:看来您将需要使用SolrTemplate来促进 commitWithin 保存。

 // Will save the document and tell Solr to commit it within 3 seconds (3000 ms).
 solrTemplateThree.save(solrDoc, 3000);

有关 Solr 中的提交策略的更多信息,请参阅以下内容:

于 2013-10-16T01:13:01.487 回答
0

使用 Spring-Data-Solr-4.0.2.RELEASE 可以实现索引的自动提交,如下所示:

SolrOperation solrOperations; //instantiated it from Spring-Solr-Data package
solrOperations.saveBean("coreName",solrDoc);
solrOperations.commit("coreName");
于 2018-12-03T06:56:08.490 回答