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?

War es hilfreich?

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:

  1. Befolgen Sie den in der definierten Abschnitt "vollständig lose Mapping" Solrnet -Mapping -Dokumentation.
  2. Ä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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top