Solr.Net查询:Windows窗体中的ArgumentException

时间:2012-08-19 14:56:19

标签: c# windows forms solrnet

所以我启动并运行了一个Windows窗体项目。它使用Lucene.Net库,并用它制作了一个Lucene索引。该程序接受用户请求,通过一些算法运行它们并在DataGridView中显示结果集。

之后我安装了XAMPP,使用Tomcat服务设置Solr 3.6.1。我将schema.xml配置如下(感谢Can a raw Lucene index be loaded by Solr?):

<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
[...]
<field name="LuminaireId" type="string" indexed="true" stored="true"/>
<field name="LampCount" type="tdouble" multiValued="true" indexed="true" stored="true" required="false"/>
[...]

我搜索了一些关于如何设置所有内容的示例,并提出了一个用于映射值的Product-Class(还有更多的值,但是为了获得图片,这就足够了,我认为)像这样:

public class SolrProduct
{
      [SolrUniqueKey("LuminaireId")]
      public string LuminaireId { get; set; }

      [SolrField("LampCount")]
      public ICollection<double> LampCount { get; set; }
}

一个简单的测试查询(使用此方法)

internal override List<KeyValuePair<Int64, Double>> CalculateRanking(List<T> checkedAttributes)
{
    Startup.Init<SolrProduct>("http://localhost:8983/solr/");
    var solr = ServiceLocator.Current.GetInstance<ISolrOperations<SolrProduct>>();
    var results = solr.Query("LampCount:1");
    // as is: no mapping for result-return for now, returning "null" instead
    return(null);
}

生成ArgumentException,告诉我“System.Collections.ArrayList”类型的对象无法转换为“System.String”类型。即使在互联网上搜索该问题并调试程序后,我仍然不理解异常。 “LampCount”是一个multiValued-Field(Lucene索引中的前NumericField),它应该在Product.cs中使用schema.xml和映射。

在localhost:8983 / solr / admin /上使用web界面时,它可以正常工作,我可以将查询作为“LampCount:1”进行查询,并返回一堆正确找到的文档。这可能是另一个问题,但是所有“按原样设置”,Solr Web界面的结果集XML显示(在每个找到的文档中):

<arr name="LampCount">
<str>ERROR:SCHEMA-INDEX-MISMATCH,stringValue=1</str>
</arr>

我使用

为Lucene索引文档索引了LampCount字段
 var valueField = new NumericField(internalname, Field.Store.YES, true);
 valueField.SetDoubleValue(value);
 doc.Add(valueField);

这可能是问题所在,因为我现在看不到大局,感到完全迷失了。非常感谢,如果你能解开我的brainknot。 ; - )

提前致谢!

1 个答案:

答案 0 :(得分:0)

您的架构和POCO之间存在不匹配。 Solr基本上试图将“tdouble”字段类型转换为您的集合。 你可以做的最好的事情是在管理控制面板中执行你的查询,然后观察回来的内容,然后问问自己,你认为它将如何处理回到你的POCO中。