单值字段作为查询的多值返回

时间:2015-10-25 18:30:00

标签: solr solr.net

我使用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对于数字字段。

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

1 个答案:

答案 0 :(得分: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>

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

    1. 解决方法是将结果读作Dictionary<string,object>,而不是让Solr.NET自动将结果反序列化为文档对象。
    2. 这意味着初始化此类型的第二个Solr操作对象:

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

      以后,获取ISolrOperations<Dictionary<string,object>>的实例并手动阅读KeyData属性,将object有效负载投射到ArrayList并且提取价值。