使用SolrNet的得分字段

时间:2012-05-08 14:05:15

标签: solr solrnet

我正在使用SolrNet,并且在分数字段与索引中添加或更新的文档冲突时出现问题。

代表我的文档的类看起来像这样

class MyDoc
{
    [SolrUniqueKey("doc_id")]
    public string DocId { get; set; }

    [SolrField("foo")]
    public string Foo { get; set; }

    [SolrField("bar")]
    public string Bar { get; set; }

    [SolrField("score")]
    public double Score { get; set; }
}

在向Solr发出的查询中,我已将'score'字段添加到fl参数,并在此类上返回并正确设置得分值。但是,在添加或更新文档时,我收到的错误是关于我的索引中不存在的得分字段,它没有,并且不应该,因为这是一个动态字段。

执行添加/更新的代码非常简单:

Startup.Container.GetInstance<ISolrOperations<MyDoc>>().Add(doc);

在添加或更新文档时,看起来我需要SolrNet(或Solr)忽略score属性,并且只在检索文档时使用它。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

我通过两个单独的课程完成了这个。一个映射到从索引检索的文档作为搜索结果,另一个类用于向索引添加项目。因此,在这种情况下,您可以执行以下操作:

 class MyDoc
 {
      [SolrUniqueKey("doc_id")]
      public string DocId { get; set; }

      [SolrField("foo")]
      public string Foo { get; set; }

      [SolrField("bar")]
      public string Bar { get; set; }
 }


 class MyDocResult
 {
      [SolrUniqueKey("doc_id")]
      public string DocId { get; set; }

      [SolrField("foo")]
      public string Foo { get; set; }

      [SolrField("bar")]
      public string Bar { get; set; }

      [SolrField("score")]
      public double Score { get; set; }
 }

确保初始化指向同一个solr url的两个类。       Startup.Init( “HTTP://本地主机:8983 / solr的”);       Startup.Init( “HTTP://本地主机:8983 / solr的”);

然后你可以添加:

  ServiceLocator.Current.GetInstance<ISolrOperations<MyDoc>>().Add(doc);

并查询:

  var solr ServiceLocator.Current.GetInstance<ISolrOperations<MyDocResult>>();
  var results = solr.Query("foo bar");

如果您不想创建两个单独的类,也可以考虑使用SolrNet的Dynamic or Fully Loose Mapping选项。

答案 1 :(得分:2)

如果您使POCO课程的分数为可为空,则可以使用相同的对象进行索引和结果

[SolrField("score")]
public double? Score { get; set; }