Использование SolrNet для запроса Solr из консольного приложения? - PullRequest
1 голос
/ 22 февраля 2012

Я пытаюсь использовать SolrNet в приложении командной строки (или, точнее, из LINQPad) для проверки некоторых запросов, и при попытке инициализировать библиотеку я получаю следующую ошибку:

Key 'SolrNet.Impl.SolrConnection.UserQuery+Resource.SolrNet.Impl.SolrConnection' already registered in container

Однако, если я уловил эту ошибку и продолжил, ServiceLocator выдаст мне следующую ошибку:

Activation error occured while trying to get instance of type ISolrOperations`1, key ""

С внутренним исключением:

The given key was not present in the dictionary.

Мой полный код выглядит следующим образом:

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"));

Я использую Tomcat 7 в Windows 7x64 с установленным Solr 3.4.0.

В StackOverflow есть еще одно сообщение о той же проблеме *1016*, хотя принят ответразмещение кода Startup.Init в Global.asax имеет отношение только к ASP.NET.

Перезапуск службы Tomcat7 решает проблему, но необходимость делать это после каждого запроса является болезненной.

Как правильно использовать библиотеку SolrNet для взаимодействия с Solr из консольного приложения C #?

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Правильный способ использования 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.

2 голосов
/ 16 января 2016

Мое решение ясно. Запуск до инициации

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