使用SolrNet启动多个Solr字典索引

时间:2015-05-22 14:56:23

标签: c# solr solrnet

我目前正在使用Solrnet实施搜索。我的索引非常大,而且因为我们是一家全球性公司,所以他们会被翻译。我最初的想法是在一个索引中有多个记录包含所有翻译,但是这最终成为一个问题,因为索引对于一个索引变得很大,所以我们按语言分割索引。例如,我创建了一个名为SearchEnglish的英文索引和一个名为SearchFrench的法语索引。

要启动Solrnet,我使用类似的东西:

Startup.Init<Dictionary<string, object>>(SearchIndexUrl);

我使用字典,因为我的Solr索引包含动态方面。问题是我的代码库需要启动所有索引。所以我无法将一个索引与另一个索引区分开来。您建议使用Solrnet处理多个字典Solr索引的启动?我在文档中没有看到任何相关内容。

谢谢, 保罗

1 个答案:

答案 0 :(得分:2)

我已经通过使用SolrNet / Windsor来初始化我的Solr实例来弄清楚如何做到这一点。我没有找到关于如何做到这一点的大量文档,所以我想分享。

这是我的一些代码。

在Global.asax.cs中,我有以下内容

    public static WindsorContainer _WindsorContainer { get; set; }

    protected void Application_Start()
    {
        InitiateSolr();
    }

    protected void Application_End()
    {
        _WindsorContainer.Dispose();
    }

    /// <summary>
    /// Initialized Misc Solr Indexes
    /// </summary>
    protected void InitiateSolr() {
        var reader = ApplicationConfig.GetResourceReader("~/Settings/AppSettings.resx");
        InitiateSolrFacetedIndex(reader);
    }

    /// <summary>
    /// Initializes The Faceted Search Indexes
    /// </summary>
    protected void InitiateSolrFacetedIndex(ResourceReader reader) {
        Data d = new Data();
        _WindsorContainer = new WindsorContainer();

        var solrFacility = new SolrNetFacility(reader.ResourceCollection["Url.SolrIndexPath"] + "EN");

        foreach (var item in d.GetLanguages())
        {
            solrFacility.AddCore("ProductSpecIndex" + item.LanguageCode.ToString(), typeof(Dictionary<string, object>), reader.ResourceCollection["Url.SolrIndexPath"] + item.LanguageCode.ToString());
        }

        _WindsorContainer.AddFacility("solr", solrFacility);

        Models.Solr.SolrWindsorContainer c = new Models.Solr.SolrWindsorContainer();
        c.SetContainer(_WindsorContainer);
    }

我还创建了一个扩展静态类来保存WindsorContainer对象。

public class SolrWindsorContainer
{
    public static WindsorContainer Container { get; set; }

    public void SetContainer(WindsorContainer container){
        Container = container;
    }
    public WindsorContainer GetContainer(){
        return Container;
    }
}

然后在我的应用程序中,我只是调用该静态对象来获取我的Windsor容器

Models.Solr.SolrWindsorContainer c = new Models.Solr.SolrWindsorContainer();
ISolrOperations<Dictionary<string, object>> solr = container.Resolve<ISolrOperations<Dictionary<string, object>>>("ProductSpecIndex" + languageCode);

var results = solr.Query("*:*");

如果您对此有任何疑问,可以在下面的链接中阅读有关solrnet和Windsor初始化的信息。

https://github.com/mausch/SolrNet/blob/master/Documentation/Initialization.md

https://github.com/mausch/SolrNet/blob/master/Documentation/Multi-core-instance.md