Проблемы с Solrnet при замене ядер
Вопрос
Я использую solrnet.0.3.1 и solrnet.ninject.0.3.1 в приложении ASP.NET MVC 3, указывающем на экземпляр Solr 3.4.
Я использую несколько ядер, чтобы я мог проверить изменения схемы на втором ядре, не разбивая приложение. Несколько ядер не являются проблемой как таковой; Приложение с радостью использует «ядро-клин», пока я побеждаю «Core-Ondeck» до смерти с глупыми опечатками и настройками схемы.
Расположение службы Solrnet-http: // [server]: 8983/[solr-instance]/и по умолчанию к ядрам с помощью настройки экземпляра solr.xml defaultcorename.
# solrnet service location
http://[server]:8983/[solr-instance]/
# instance's solr.xml settings for multiple cores
<solr sharedLib="lib" persistent="true">
<cores adminPath="/admin/cores" defaultCoreName="core-live">
<core name="core-live" instanceDir="conf/core0/" />
<core name="core-ondeck" instanceDir="conf/core1/" />
</cores>
</solr>
После тестирования схемы изменений на втором ядре из Gui Brower Admin Browser, я обменял ядра, и приложение теперь должно использовать только ядро, которое я только что изменил.
# swap cores so app uses modified schema and index
curl "http://[server]:8983/[solr-instance]/admin/cores?action=SWAP&name=core-live&other=core-ondeck"
За исключением того, что Solrnet не обращает внимания на изменения схемы и, например, врезается в запрос, потому что поле, которое было из строки типа в старой схеме, теперь имеет тип DateTime в новом.
[ArgumentException: Object of type 'System.DateTime' cannot be converted to type 'System.String'.]
System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast) +6429224
System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) +12711129
System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) +129
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +522
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +38
System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index) +44
SolrNet.Impl.DocumentPropertyVisitors.RegularDocumentVisitor.Visit(Object doc, String fieldName, XmlNode field) in c:\prg\SolrNet\svn\SolrNet\Impl\DocumentPropertyVisitors\RegularDocumentVisitor.cs:48
SolrNet.Impl.DocumentPropertyVisitors.AggregateDocumentVisitor.Visit(Object doc, String fieldName, XmlNode field) in c:\prg\SolrNet\svn\SolrNet\Impl\DocumentPropertyVisitors\AggregateDocumentVisitor.cs:37
SolrNet.Impl.DocumentPropertyVisitors.DefaultDocumentVisitor.Visit(Object doc, String fieldName, XmlNode field) in c:\prg\SolrNet\svn\SolrNet\Impl\DocumentPropertyVisitors\DefaultDocumentVisitor.cs:39
SolrNet.Impl.SolrDocumentResponseParser`1.ParseDocument(XmlNode node, ICollection`1 fields) in c:\prg\SolrNet\svn\SolrNet\Impl\SolrDocumentResponseParser.cs:65
SolrNet.Impl.SolrDocumentResponseParser`1.ParseResults(XmlNode parentNode) in c:\prg\SolrNet\svn\SolrNet\Impl\SolrDocumentResponseParser.cs:50
SolrNet.Impl.ResponseParsers.ResultsResponseParser`1.Parse(XmlDocument xml, SolrQueryResults`1 results) in c:\prg\SolrNet\svn\SolrNet\Impl\ResponseParsers\ResultsResponseParser.cs:41
SolrNet.Impl.SolrQueryResultParser`1.Parse(String r) in c:\prg\SolrNet\svn\SolrNet\Impl\SolrQueryResultParser.cs:46
SolrNet.Impl.SolrQueryExecuter`1.Execute(ISolrQuery q, QueryOptions options) in c:\prg\SolrNet\svn\SolrNet\Impl\SolrQueryExecuter.cs:309
SolrNet.Impl.SolrBasicServer`1.Query(ISolrQuery query, QueryOptions options) in c:\prg\SolrNet\svn\SolrNet\Impl\SolrBasicServer.cs:83
SolrNet.Impl.SolrServer`1.Query(ISolrQuery query, QueryOptions options) in c:\prg\SolrNet\svn\SolrNet\Impl\SolrServer.cs:50
Andornot.FhaPhem.Core.Search.SolrSearchOperations.GetResults(ISearchParameters searchParameters) in C:\svn\Client Projects\Fraser Health\PHEM\trunk\Web\Andornot.FhaPhem.Core\Search\SolrSearchOperations.cs:55
Andornot.FhaPhem.Core.Search.SolrSearchOperations.Query(ISearchParameters searchParameters) in C:\svn\Client Projects\Fraser Health\PHEM\trunk\Web\Andornot.FhaPhem.Core\Search\SolrSearchOperations.cs:29
Andornot.FhaPhem.Web.Controllers.SearchController.Results(Nullable`1 id) in C:\svn\Client Projects\Fraser Health\PHEM\trunk\Web\Andornot.FhaPhem.Web\Controllers\SearchController.cs:77
lambda_method(Closure , ControllerBase , Object[] ) +118
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +264
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +129
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +826410
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +826410
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +314
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +825632
System.Web.Mvc.Controller.ExecuteCore() +159
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375
Как обновить понимание Solrnet схемы на лету, чтобы работать с обменом ядра?
Решение
Вот аналогичная ситуация, используя инструменты, которые, вероятно, более знакомые:
У вас есть реляционная база данных (допустим, Microsoft SQL Server) с таблицей «человек» с поле «Данные» типа VARCHAR. В вашем коде вы получаете доступ к этой таблице через ORM (nhibernate или EF, не имеет значения), где у вас есть класс Person
с собственностью data
типа string
в C#.
Теперь вы редактируете схему таблицы с помощью SQL Server Enterprise Manager и изменяете дата поля «Данные» на DateTime.
Если вы тоже не обновите свой код, чтобы отразить это изменение схемы, ваш код сломается.
Это именно то, что происходит в вашем случае, за исключением Solr вместо реляционной базы данных и Solrnet вместо ORM. Вы пытаетесь получить дату от Solr в строковое свойство.
Решения:
- Обновите свой код, чтобы отразить изменения в вашей новой схеме.
- Переключить на Solrnet полностью свободное отображение. Анкет Не рекомендуется, это, вероятно, взорвется с такими изменениями.
Другие советы
Я считаю, что ваша проблема связана с тем, как у вас есть настройка картирования в Solrnet. Если вы меняете тип поля в своей схеме Solr, вам нужно будет внести такое же соответствующее изменение в вашем сорневом отображении.
Чтобы позволить Solrnet работать с изменениями схемы лета, вам нужно будет внедрить одно из следующих действий:
- Следуйте разделу «Полностью свободное отображение», определенное в Документация со стороны сольрнета.
- Динамически измените свой класс Solrnet, отображенный, когда схема была изменена на новый класс с картинами, который соответствует новой схеме.
Первый вариант, вероятно, будет самым простым способом.