我使用Solr.NET对数据进行索引,然后在本地Solr服务器(Solr.net v0.4,Solr v5.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'财产' Id'文档类型My.Namespace.Record"
这意味着当我将Id属性存储为long
时,它被ArrayList
longs
检索。如果我尝试检索其他字段,我会得到相同的错误 - 我存储一个字符串,但检索它们的集合。这会崩溃,因为它正在尝试创建Record
的实例,其中Id
属性是单个long
。
通过Web界面浏览索引显示该属性确实是多值的 - 我看到的JSON包含所有属性的数组。同样,在模式浏览器中,我可以看到我的字段被定义为多值(对于Properties和Schema,而不是Indexing)。在索引的托管模式文件中,我可以看到我的字段被定义为strings
(对于字符串字段)或tlongs
对于数字字段。
Record
对象中?答案 0 :(得分:3)
我找到了解决方案和解决方法。
Solr 5.3.1中的新索引/核心,如果未明确提供solrconfig.xml文件,则复制<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
并且提取价值。