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?

Était-ce utile?

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:

  1. Suivez la section "mapping entièrement libre" définie dans le SolrNet documentation Mapping .
  2. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top