使用 SolrNet 从控制台应用程序查询 Solr?

问题描述 投票:0回答:2

我尝试在命令行应用程序(或更准确地说,从 LINQPad)中使用 SolrNet 来测试一些查询,并且在尝试初始化库时,出现以下错误:

密钥“SolrNet.Impl.SolrConnection.UserQuery+Resource.SolrNet.Impl.SolrConnection”已在容器中注册

但是,如果我发现此错误并继续,

ServiceLocator
会给我以下错误:

尝试获取 ISolrOperations`1 类型的实例,键“”时发生激活错误

除了内部例外:

字典中不存在给定的键。

我的完整代码如下所示:

try
{
    Startup.Init<Resource>("http://localhost:8080/solr/");
    Console.WriteLine("Initialized\n");
}
catch (Exception ex)
{
    Console.WriteLine("Already Initialized: " + ex.Message);
}

// This line causes the error if Solr is already initialized
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Resource>>();

// Do the search
var results = solr.Query(new SolrQuery("title:test"));

我在 Windows 7x64 上运行 Tomcat 7,并安装了 Solr 3.4.0。

Stack Overflow 有 关于同一问题的另一个问题,尽管将

Startup.Init
代码放入 Global.asax 中的公认答案仅与 ASP.NET 相关。

重新启动 Tomcat7 服务可以解决问题,但每次查询后都必须这样做很痛苦。

从 C# 控制台应用程序使用 SolrNet 库与 Solr 交互的正确方法是什么?

solr linqpad solrnet
2个回答
6
投票

在控制台应用程序中使用 SolrNet 的正确方法是仅执行该行

Startup.Init<Resource>("http://localhost:8080/solr/");

在控制台应用程序的生命周期内一次。我通常将其作为我的

Main
方法中的第一行,如下所示...

static void Main(string[] args)
{
     Startup.Init<Resource>("http://localhost:8080/solr/");

     // Call method or do work to query from solr here... 
     // Using your code in a method...
     QuerySolr();
}

private static void QuerySolr()
{
     var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Resource>>();

     // Do the search
     var results = solr.Query(new SolrQuery("title:test"));
}

您的错误来自于您尝试多次初始化 SolrNet 连接。您只需要在控制台应用程序启动时初始化一次,然后在需要时通过

ServiceLocator
引用(查找)。


3
投票

我的解决方案是明确 Startup before Init

Startup.Container.Clear();
Startup.InitContainer();
Startup.Init<Resource>("http://localhost:8080/solr/");
© www.soinside.com 2019 - 2024. All rights reserved.