2012-05-08 12 views
1

私はSolrNetを使用しており、スコアフィールドがインデックス内で追加または更新されているドキュメントと競合しているという問題があります。SolrNetでスコアフィールドを使用する

マイドキュメントを表すクラスはSolrのに発行されたクエリでこの

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; } 
} 

ようになり、私はflパラメータに「スコア」フィールドを追加した、とスコア値が返され、設定されていますこのクラスで正しくただし、文書を追加または更新する際には、インデックスには存在しないスコアフィールドについてはエラーが発生します。インデックスフィールドには存在しません。動的フィールドである必要はありません。

追加/更新を行うコードは非常に簡単です:

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

それは私がSolrNet(またはSolrの)によって無視されるように、スコアのプロパティを必要とするように文書を追加または更新するときに見える、と場合にのみ、それを使用しますドキュメントを取り出す。

これを達成する方法はありますか?

答えて

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");また、あなたは二つの別々のクラスを作成したくない場合はSolrNetためDynamic or Fully Loose Mappingオプションを使用してに見ることができ

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

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

とクエリと:と

次に、あなたが追加することができます。

2

あなたは、インデックスのために同じオブジェクトを使用することができますnullとしてスコアを持っているあなたのPOCOクラスを作成し、

[SolrField("score")] 
public double? Score { get; set; } 
をもたらした場合
関連する問題