在运行时连接到多个核心
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>>();
}
有没有办法根据动态数据动态定义与新 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>>();
}