プロジェクトで Spring Data Solr を使用しています。場合によっては、Solr に対して生成されたクエリが大きすぎて (例: 15Kb+)、Solr 例外が発生します。このソリューション: http://codingtricks.fidibuy.com/participant/join/54fce329b760506d5d9e7db3/Spring-Data-Solr-cannot-handle-long-queries は、一部のクエリでまだ失敗します。これらのクエリを POST 経由で Solr に直接送信しても問題ないため、この方向で作業することにしました。Spring Data Solr で、クエリの優先メソッド (GET/POST) を構成する方法を見つけることができませんでした。したがって、次の解決策にたどり着きました: SolrServer を拡張しました。
public class CustomSolrServer extends HttpSolrServer {
public CustomSolrServer(String home, String core) {
super(home);
setCore(core);
}
@Override
public QueryResponse query(SolrParams params) throws SolrServerException {
METHOD method = METHOD.GET;
if (isBigQuery(params)) {
method = METHOD.POST;
}
return new QueryRequest( params, method ).process( this );
}
}
(いくつかの詳細はスキップされます。setCore() と isBigQuery() も簡単でスキップされます)、SolrConfiguration.class で SolrServer Bean として使用します。
@Configuration
@EnableSolrRepositories(basePackages = { "com.vvy.repository.solr" }, multicoreSupport=false)
@Import(value = SolrAutoConfiguration.class)
@EnableConfigurationProperties(SolrProperties.class)
public class SolrConfiguration {
@Autowired
private SolrProperties solrProperties;
@Value("${spring.data.solr.core}")
private String solrCore;
@Bean
public SolrServer solrServer() {
return new CustomSolrServer(solrProperties.getHost(),solrCore) ;
}
}
これは正常に機能しますが、いくつかの欠点があります。multiCoreSupport を false に設定する必要がありました。これは、Spring Data Solr がインターフェースからリポジトリを実装するときに、multiCoreSupport を使用して MultiCoreSolrServerFactory を使用し、コアごとにサーバーを格納しようとするためです。これは、サーバーを保持マップに複製することによって行われます。SolrServerUtils はそれを clone() する方法を知らないため、当然、カスタマイズされた SolrServer でクラッシュします。また、Spring Data がエンティティ クラスの @SolrDocument アノテーションのパラメーターからコアを抽出するのを楽しむのではなく、コアを手動で設定する必要があります。
ここに質問があります 1) 主な一般的な質問: Spring Data Solr で長すぎるクエリの問題を解決する (または、より具体的には、GET の代わりに POST を使用する) 合理的な方法はありますか? 2) マイナーなもの: Spring Data Solr で SolrServer をカスタマイズしながら multiCoreSupport を維持する合理的な方法はありますか?