首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交换内核时solrnet带来的问题

交换内核时solrnet带来的问题
EN

Stack Overflow用户
提问于 2011-11-30 08:58:26
回答 2查看 1.2K关注 0票数 0

我在一个指向Solr3.4实例的ASP.NET MVC3应用程序中使用SolrNet.0.3.1和SolrNet.Ninject.0.3.1。

我使用多个核心,所以我可以在第二个核心上测试模式更改,而不会破坏应用程序。多核本身并不是问题所在;当我用愚蠢的打字错误和对模式的调整将"core-ondeck“打死的时候,应用程序却愉快地使用了"core-live”。

Solrnet的服务位置是http://[server]:8983/[solr-instance]/,通过实例的solr.xml defaultCoreName设置缺省为core-live。

代码语言:javascript
复制
# 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>

在Solr的浏览器管理GUI中测试了第二个核心上的模式更改后,我交换了核心,应用程序现在应该使用我刚刚修改的核心。

代码语言:javascript
复制
# 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"

但是solrnet不会注意到模式的变化,例如,它会导致查询失败,因为在旧模式中属于String类型的字段现在在新模式中属于DateTime类型。

代码语言:javascript
复制
[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

如何动态更新solrnet对模式的理解,使其能够与核心交换一起工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-30 09:20:08

这里有一个类似的情况,使用可能更熟悉的工具:

您有一个关系数据库(假设是Microsoft SQL Server),其中有一个表"Person“和一个类型为varchar的字段"data”。在您的代码中,您可以通过ORM (NHibernate或EF,无关紧要)来访问这个表,其中您有一个类Person,它的属性data在C#中的类型为string

现在,您可以使用SQL Server企业管理器编辑表的架构,并将字段"data“的数据类型更改为datetime。

除非您也更新代码以反映此模式更改,否则您的代码将崩溃。

这就是在您的例子中发生的事情,除了使用Solr而不是关系数据库,使用SolrNet而不是ORM。您正在尝试将日期从Solr获取到字符串属性中。

解决方案:

  • 更新代码以反映新架构中的更改。
  • 切换到SolrNet fully loose mapping。并不推荐这样做,因为这样的改变很可能会让它爆炸。
票数 4
EN

Stack Overflow用户

发布于 2011-11-30 09:19:32

我相信您的问题与您如何在SolrNet中设置地图有关。如果要更改Solr模式中的字段类型,则需要在SolrNet映射中进行相同的相应更改。

为了允许SolrNet动态处理模式更改,您需要实现以下操作之一:

  1. 遵循SolrNet Mapping documentation中定义的“完全松散映射”部分。当架构更改为与新架构匹配的新映射类时,
  2. 会动态更改SolrNet映射类。

第一种选择可能是最简单的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8319872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档