problèmes avec solrnet quand vous échangez des noyaux
Question
J'utilise SolrNet.0.3.1 et SolrNet.Ninject.0.3.1 dans une application ASP.NET MVC 3 pointant vers une instance Solr 3.4.
J'utilise plusieurs cœurs afin que je puisse tester les modifications du schéma sur un second noyau sans casser l'application. noyaux multiples ne sont pas le problème en soi; l'application utilise heureusement « -live core » alors que je suis en battant « core-OnDeck » à mort avec des fautes de frappe et muets coups secs au schéma.
point de service de Solrnet est http: // [serveur]:. 8983 / [solr instance] / et par défaut à vivre coeur via le réglage defaultCoreName de solr.xml de l'instance
# 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>
Après avoir testé les modifications du schéma sur le second noyau de l'interface graphique d'administration du navigateur de Solr, j'échange des noyaux et l'application devrait maintenant utiliser le noyau que je viens de modifier.
# 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"
Sauf solrnet ne prend pas connaissance des modifications du schéma et, par exemple, explose sur une requête parce que le champ qui était de type String dans l'ancien schéma est maintenant de type DateTime dans le nouveau.
[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
Comment puis-je rafraîchir la compréhension de solrnet du schéma à la volée, d'une manière qui fonctionnerait avec swapping de base?
La solution
Voici une situation analogue, en utilisant des outils qui sont probablement plus familiers:
Vous avez une base de données relationnelle (supposons que Microsoft SQL Server) avec une table « personne » avec un champ « données » de type varchar. Dans votre code, vous accédez à ce tableau par un ORM (NHibernate ou EF, peu importe), où vous avez un Person
de classe avec un data
de propriété de type string
en C #.
Maintenant, vous modifier le schéma de la table avec SQL Server Enterprise Manager, et changer le type de données du champ « données » à datetime.
Sauf si vous mettez à jour votre code aussi pour refléter ce changement de schéma, votre code cassera.
Ceci est exactement ce qui se passe dans votre cas, sauf Solr au lieu d'une base de données relationnelle et SolrNet au lieu d'un ORM. Vous essayez d'obtenir une date de Solr dans une propriété de chaîne.
Solutions:
- Mettez à jour votre code afin de refléter les changements dans votre nouveau schéma.
- Commutateur à SolrNet cartographie entièrement lâche . Pas vraiment recommandé, il va probablement faire exploser de toute façon avec un changement comme ça.
Autres conseils
Je crois que votre problème est lié à la façon dont vous avez la configuration de votre cartographie en SolrNet. Si vous changez le type de champ dans votre schéma Solr, vous aurez besoin de faire le même changement correspondant dans votre SolrNet mapping.
Afin de permettre SolrNet de travailler avec les changements de schéma de vol, vous devrez implemetn une des opérations suivantes:
- Suivez la section "mapping entièrement libre" définie dans le SolrNet documentation Mapping .
- Dynamiquement changer votre SolrNet cartographié classe lorsque le schéma a été modifié à une nouvelle classe mappée qui correspond au nouveau schéma.
La première option sera probablement la meilleure façon.