在运行时连接到多个核心

Connecting to multiple cores at runtime

有没有办法根据动态数据动态定义与新 Solr 核心的连接?

我们有一个场景,我们的 Solr 安装有多个 Cores/Indexes 用于相同类型的文档,按日期分隔(因此给定一周的文档将在索引 1 上,前一周的在索引 2 上,依此类推).

因此,当我收到查询时,我会查看所需的日期范围,并根据它查询特定的核心。我事先不知道在启动时我将拥有哪些内核,因为可以在运行时动态创建新内核。

使用内置的 ServiceLocation 提供程序,无法 link 两个不同的核心到同一个文档 class。但即使我使用不同的 DI 容器(目前在我的例子中是 Autofac),我仍然需要在组件注册期间提前指定所有核心 URL。

除了始终创建一个新的 Autofac 容器、从中生成 ISolrOperation<> class 并在下次需要连接到核心之前释放它之外,是否有其他方法可以绕过它?

Mauricio Scheffer(Solr.Net 的开发者)的 comment 确认 built-in 不支持即时连接到不同的索引 URL。因此,我没有自己实例化内部对象,而是在现有的基于 Autofac 的 DI 容器之上使用了 hack:

public ISolrOperations<TDocument> ConnectToIndex<TDocument>(string indexUrl)
{
    // Create a new AutoFac container environment.
    ContainerBuilder builder = new ContainerBuilder(); 

    // Autofac-for-Solr.Net config element.
    var cores = new SolrServers 
    {
        new SolrServerElement 
        {
            Id = indexUrl,
            DocumentType = typeof (TDocument).AssemblyQualifiedName,
            Url = indexUrl,
        }
    };

    // Create the Autofac container.
    builder.RegisterModule(new SolrNetModule(cores));
    var container = builder.Build();

    // Resolve the SolrNet object for the URL.     
    return container.Resolve<ISolrOperations<TDocument>>();
}