我正在使用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属性,并且只在检索文档时使用它。
有没有办法实现这个目标?
答案 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; }