我正在为所有CRUD操作使用SolrCrudRepository。它应该在调用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());
}
}
答案 0 :(得分:2)
在Solr中索引文档时,在将其提交到索引之前,它将无法进行搜索。这就是为什么你必须调用.commit()
方法(或重新加载核心)才能在查询时看到这个文档。
但是,最近的问题DATASOLR-107 Added commitWithin Support为.save()
方法(以及其他一些方法)添加了一个额外的参数,允许您以毫秒为单位指定文档之前的时间长度承诺。按如下方式更改您的代码:
更新:似乎您需要使用SolrTemplate来促进commitWithin save。
// Will save the document and tell Solr to commit it within 3 seconds (3000 ms).
solrTemplateThree.save(solrDoc, 3000);
有关Solr中提交策略的更多信息,请参阅以下内容:
答案 1 :(得分:0)
使用Spring-Data-Solr-4.0.2.RELEASE可以自动实现索引的提交,如下所示:
SolrOperation solrOperations; //instantiated it from Spring-Solr-Data package
solrOperations.saveBean("coreName",solrDoc);
solrOperations.commit("coreName");