Search code examples
solrnet

Connecting to multiple cores at runtime


Is there a way to define a connection to a new Solr core on the fly, based on dynamic data?

We have a scenario where our Solr installation has multiple Cores/Indexes for the same type of document, separated by date (so a given week's documents will be on Index 1, the previous week's on Index 2, etc).

So when I receive my query, I check to see the required date range, and based on it, I want to query a specific core. I don't know in advance, at startup, which cores I will have, since new ones can be created dynamically during runtime.

Using the built-in ServiceLocation provider, there's no way to link two different Cores to the same document class. But even if I use a different DI container (currently Autofac in my case), I still need to specify all Core URLs in advance, during component registration.

Is there a way to bypass it except for always creating a new Autofac Container, generating the ISolrOperation<> class from it, and releasing it until the next time I need to connect to a core?


Solution

  • Mauricio Scheffer (developer of Solr.Net)'s comment confirmed that there's no built-in support for connecting to different index URLs on the fly. So instead of instantiating the internal objects myself, I used a hack on top of my existing Autofac based DI container:

    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>>();
    }