0

すべての 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());
    }

}
4

2 に答える 2

2

Solr でドキュメントにインデックスを付けると、ドキュメントがインデックスにコミットされるまで検索に使用できなくなります。これが、クエリ時にこのドキュメントを表示するために、メソッドを呼び出す.commit()(またはコアをリロードする) 必要がある理由です。

ただし、最近の問題DATASOLR-107 追加された commitWithin サポート.save()があり、ドキュメントがコミットされるまでの時間をミリ秒単位で指定できるようにする追加のパラメーターがメソッドに (他のパラメーターと共に) 追加されました。コードを次のように変更します。

更新: commitWithin 保存を容易にするために、 SolrTemplateを使用する必要があるようです。

 // 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 に答える