使用SolrCrudRepository和SolrTemplate索引Solr文档

时间:2013-10-15 16:07:10

标签: solr spring-data solrj

我正在为所有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());
    }

}

2 个答案:

答案 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");