Probleme mit Solrnet beim Tausch von Kernen
Frage
Ich verwende Solrnet.0.3.1 und solrnet.ninject.0.3.1 in einer ASP.NET MVC 3 -App, die auf eine Solr 3.4 -Instanz zeigt.
Ich verwende mehrere Kerne, damit ich Schema -Änderungen in einem zweiten Kern testen kann, ohne die App zu brechen. Mehrere Kerne sind an sich nicht das Problem; Die App verwendet glücklich "Core-Live", während ich "Core-Oncock" zu Tode mit dummen Tippfehler und Änderungen an das Schema schlage.
Der Service-Standort von Solrnet lautet http: // [Server]: 8983/[Solr-incance]/und Standards für Core-Live über die Einstellung von Solr.xml StandardCorename der Instanz.
# 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>
Nachdem ich Schema -Änderungen im zweiten Kern der Browser -Administrator -GUI von Solr getestet hatte, tausche ich Kerne aus und die App sollte jetzt den Kern verwenden, den ich gerade geändert habe.
# 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"
Außer SolRNet nimmt die Schema -Änderungen nicht zur Kenntnis und bläst beispielsweise auf eine Abfrage auf, da das Feld, das im alten Schema vom Typ Zeichenfolge war, jetzt in der neuen typischen DateTime enthält.
[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
Wie erfrischt ich Solrnets Verständnis des Schemas im laufenden Fliegen auf eine Weise, die mit dem Kerntausch funktioniert?
Lösung
Hier ist eine analoge Situation, in der Tools verwendet werden, die wahrscheinlich vertrauter sind:
Sie haben eine relationale Datenbank (sagen wir Microsoft SQL Server) mit einer Tabelle "Person" mit einem Feld "Daten" vom Typ varchar. In Ihrem Code greifen Sie auf diese Tabelle über ein ORM zu (NhiberNate oder EF, egal), wo Sie eine Klasse haben Person
mit einer Eigenschaft data
vom Typ string
in C#.
Jetzt bearbeiten Sie das Schema der Tabelle mit dem SQL Server Enterprise Manager und ändern den Datentyp des Feldes "Daten" in DateTime.
Wenn Sie Ihren Code nicht aktualisieren, um diese Schemaänderung widerzuspiegeln, wird Ihr Code unterbrochen.
Dies ist genau das, was in Ihrem Fall passiert, außer bei Solr anstelle einer relationalen Datenbank und Solrnet anstelle eines ORM. Sie versuchen, ein Datum von Solr in eine String -Eigenschaft zu bringen.
Lösungen:
- Aktualisieren Sie Ihren Code, um die Änderungen in Ihrem neuen Schema widerzuspiegeln.
- Wechseln zu Solrnet vollständig lose Mapping. Nicht wirklich empfohlen, es wird wahrscheinlich sowieso mit einer solchen Veränderung in die Luft jagen.
Andere Tipps
Ich glaube, Ihr Problem bezieht sich auf die Art und Weise, wie Sie Ihr Mapping -Setup in Solrnet haben. Wenn Sie den Feldtyp in Ihrem Solr -Schema ändern, müssen Sie die gleiche entsprechende Änderung Ihrer Solrnet -Zuordnung vornehmen.
Um Solrnet zu ermöglichen, mit Änderungen im Fliegenschema zu arbeiten, müssen Sie eine der folgenden Folgen implementieren:
- Befolgen Sie den in der definierten Abschnitt "vollständig lose Mapping" Solrnet -Mapping -Dokumentation.
- Ändern Sie Ihre Solrnet -kartierte Klasse dynamisch, wenn das Schema in eine neue zugeordnete Klasse geändert wurde, die dem neuen Schema entspricht.
Die erste Option wird wahrscheinlich der einfachste Weg sein.