1

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 に対して発行されるクエリで、「スコア」フィールドをflパラメーターに追加すると、スコア値が返され、このクラスに正しく設定されます。ただし、ドキュメントを追加または更新すると、スコア フィールドがインデックスに存在しないというエラーが表示されます。これは動的フィールドであるため、存在しないはずです。

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

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

ドキュメントを追加または更新するときにSolrNet(またはSolr)によってスコアプロパティを無視し、ドキュメントを取得するときにのみ使用する必要があるようです。

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

4

2 に答える 2

2

私は2つの別々のクラスを持つことでこれを達成しました。1 つは検索結果としてインデックスから取得されるドキュメントにマップされ、もう 1 つはアイテムをインデックスに追加するために使用されるクラスです。したがって、このシナリオでは、次のことができます。

 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");

2 つの別個のクラスを作成したくない場合は、SolrNetのDynamic または Fully Loose Mappingオプションの使用を検討することもできます。

于 2012-05-08T14:24:18.827 に答える
2

POCO クラスに Score を null 可能にすると、インデックス作成と結果に同じオブジェクトを使用できます

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