2

我使用 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' 转换为文档类型 My.Namespace.Record 的属性 'Id'”

这意味着当我将 Id 属性存储为 along时,它被检索为ArrayListof longs。如果我尝试检索其他字段,我会得到相同的错误 - 我存储一个字符串,但检索它们的集合。这会崩溃,因为它正在尝试创建 的实例Record,其中Id属性是单个long

通过 Web 界面浏览索引显示该属性确实是多值的——我看到的 JSON 包含所有属性的数组。同样,在模式浏览器中,我可以看到我的字段被定义为多值(对于属性和模式,而不是索引)。在索引的托管模式文件中,我可以看到我的字段被定义为strings(对于字符串字段)或tlongs数字字段。

  1. 为什么 Solr(或 Solr.Net)将我的单值字段索引为多值?
  2. 我可以在不手动编辑架构的情况下防止这种情况发生吗?也许使用字段属性?
  3. 我可以只检索多值属性的单个值吗?所以如果我无法修复架构,我可以简单地将数据检索到我的单值Record对象中吗?
4

1 回答 1

3

我找到了解决方案和解决方法。

  1. 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>

注意stringstlongs数据类型。为防止这种情况,您可以更改solrconfig.xml核心conf文件夹中的 以使用单值数据类型(stringtlong等),或更改新创建的核心的默认值。

  1. 解决方法是将结果读取为Dictionary<string,object>,而不是让 Solr.NET 自动将结果反序列化为文档对象。

这意味着为此类型初始化第二个 Solr 操作对象:

   Startup.Init<Record>(indexUrl); // Typed
   Startup.Init<Dictionary<string, object>>(indexUrl); // Untyped.

然后,获取一个实例ISolrOperations<Dictionary<string,object>>并从中手动读取 myKeyData属性,将object有效负载转换为 anArrayList并提取值。

于 2015-10-26T13:11:45.183 回答