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?

¿Fue útil?

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:

  1. Siga la sección de "mapeo completamente suelto" definida en el Documentación de mapeo de Solrnet.
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top