我使用Solr.NET索引数据,然后在本地Solr服务器上查询数据(Solr.net v0.4,Solrv5.3.1),并得到奇怪的异常。
我的索引记录是一个简单的类(在这里简化):
public class Record
{
[SolrUniqueKey]
public long Id {get;set;}
[SolrUniqueKey]
public string Data {get;set;}
}通过调用ISolrOperations.Add()将其添加到索引中。我没有事先定义模式-它是由我输入的数据自动生成的。
在其他地方,我使用ISolrReadOnlyOperations.Query()查询这个索引,只询问Id字段。此查询显然返回结果,但使用ArgumentException崩溃:
“无法将值'System.Collections.ArrayList‘转换为文档类型My.Namespace.Record的属性'Id’”
这意味着,当我将Id属性存储为long时,它将作为ArrayList of longs进行检索。如果我试图检索其他字段,我会得到相同的错误--我存储一个字符串,但是检索它们的集合。这会崩溃,因为它试图创建一个Record实例,其中Id属性是单个long。
通过web界面浏览索引显示,该属性实际上是多值的--我看到的JSON包含一个用于所有属性的数组。同样,在模式浏览器中,我可以看到我的字段被定义为多值(对于Properties和Schema,而不是索引)。在索引的托管模式文件中,我可以看到我的字段被定义为strings (用于字符串字段)或tlongs (用于数字字段)。
Record对象中。发布于 2015-10-26 13:11:45
我找到了解决办法和解决办法。
<solr dir>\server\solr\configsets\data_driven_schema_configs\conf中找到的默认文件。该文件定义了一个updateProcessRequestChain,它定义了在没有架构的情况下添加新文档时会发生什么。默认情况下,在其中定义的类型是多值的:
<processor class="solr.AddSchemaFieldsUpdateProcessorFactory"> <str name="defaultFieldType">strings</str> <lst name="typeMapping"> <str name="valueClass">java.lang.Long</str> <str name="valueClass">java.lang.Integer</str> <str name="fieldType">tlongs</str> </lst> </processor>注意strings和tlongs数据类型。为了防止这种情况,您可以更改核心的solrconfig.xml文件夹中的conf,以使用单值数据类型(string、tlong等),或者更改新创建的核心的默认值。
Dictionary<string,object>,而不是让Solr.NET将结果反序列化为文档对象。这意味着为该类型初始化第二个Solr操作对象:
Startup.Init<Record>(indexUrl); // Typed
Startup.Init<Dictionary<string, object>>(indexUrl); // Untyped.然后,获取ISolrOperations<Dictionary<string,object>>的一个实例,并从其中手动读取Key和Data属性,将object有效负载转换为ArrayList并提取值。
https://stackoverflow.com/questions/33333380
复制相似问题