1

我正在使用 SolrNet,并且遇到一个问题,即 score 字段与索引中添加或更新的文档冲突。

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

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 属性,并且仅在检索文档时使用它。

有什么办法可以做到这一点?

4

2 回答 2

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://localhost:8983/solr"); Startup.Init("http://localhost:8983/solr");

然后你可以添加:

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

并查询:

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

如果您不想创建两个单独的类,您还可以考虑使用 SolrNet 的动态或完全松散映射选项。

于 2012-05-08T14:24:18.827 回答
2

如果您使 POCO 类的 Score 可以为空,则可以使用相同的对象进行索引和结果

[SolrField("score")]
public double? Score { get; set; }
于 2014-10-16T15:17:51.633 回答