problemas con solrnet al intercambiar núcleos
Pregunta
Estoy usando Solrnet.0.3.1 y solrnet.ninject.0.3.1 en una aplicación ASP.NET MVC 3 que apunta a una instancia Solr 3.4.
Estoy usando múltiples núcleos para poder probar los cambios de esquema en un segundo núcleo sin romper la aplicación. Múltiples núcleos no son el problema per se; La aplicación felizmente usa "Core-Live" mientras estoy golpeando "Core-Andeck" hasta la muerte con errores tipográficos y ajustes al esquema.
La ubicación del servicio de Solrnet es http: // [servidor]: 8983/[Solr-instance]/y predeterminado a Core-Live a través de la configuración Solr.xml 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>
Después de probar los cambios de esquema en el segundo núcleo de la GUI de administrador del navegador de Solr, intercambio núcleos y la aplicación ahora debería usar el núcleo que acabo de modificar.
# 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"
Excepto que Solrnet no se da cuenta de los cambios de esquema y, por ejemplo, explota una consulta porque el campo que era de tipo de cadena en el esquema antiguo ahora es de tipo de tiempo en lo nuevo.
[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
¿Cómo actualizo la comprensión de Solrnet del esquema sobre la marcha, de una manera que funcionaría con el intercambio de núcleo?
Solución
Aquí hay una situación análoga, utilizando herramientas que probablemente sean más familiares:
Tiene una base de datos relacional (digamos que Microsoft SQL Server) con una tabla "persona" con un campo "datos" de tipo varchar. En su código, accede a esta tabla a través de un ORM (NHibernate o EF, no importa), donde tiene una clase Person
con una propiedad data
de tipo string
Cía# .
Ahora edite el esquema de la tabla con SQL Server Enterprise Manager y cambia el tipo de datos del campo "Datos" a DateTime.
A menos que actualice su código también para reflejar este cambio de esquema, su código se romperá.
Esto es exactamente lo que está sucediendo en su caso, excepto con Solr en lugar de una base de datos relacional, y Solrnet en lugar de un ORM. Estás tratando de obtener una cita de Solr en una propiedad de cadena.
Soluciones:
- Actualice su código para reflejar los cambios en su nuevo esquema.
- Cambiar a Solrnet Mapeo totalmente suelto. No se recomienda realmente, probablemente explotará de todos modos con un cambio como ese.
Otros consejos
Creo que su problema está relacionado con cómo tiene su configuración de mapeo en Solrnet. Si está cambiando el tipo de campo en su esquema SOLR, deberá hacer el mismo cambio correspondiente en su asignación de Solrnet.
Para permitir que SolrNet funcione con los cambios de esquema de mosca, deberá implementar uno de los siguientes:
- Siga la sección de "mapeo completamente suelto" definida en el Documentación de mapeo de Solrnet.
- Cambie dinámicamente su clase asignada por Solrnet cuando el esquema se haya cambiado a una nueva clase mapeada que coincida con el nuevo esquema.
La primera opción probablemente será la forma más fácil.