2012-05-08 2 views
1

저는 SolrNet을 사용하고 있으며 점수 필드가 색인에서 추가되거나 업데이트되는 문서와 충돌하는 문제가 있습니다.SolrNet에서 스코어 필드 사용

내 문서를 나타내는 클래스는, 나는 fl 매개 변수에 '점수'필드를 추가 한 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; } 
} 

같은 것을보고, 점수 값이 반환 및 설정 이 클래스에서 올바르게. 그러나 문서를 추가하거나 업데이트 할 때 내 색인에없는 점수 필드에 대한 오류가 발생합니다.이 색인 필드는 동적 필드가 아니므로 안됩니다.

추가/업데이트를하고 코드는 매우 간단하다 : 나는 문서를 추가하거나 업데이트 할 때 SolrNet (또는 SOLR)에 의해 무시되는 점수 속성이 필요한 것처럼

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

것 같습니다, 그리고 경우에만 사용 문서 검색.

이것을 달성 할 방법이 있습니까?

답변

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

당신은 당신의 POCO 클래스를 사용하면 인덱싱 같은 개체를 사용할 수 있습니다 널 (NULL)로 점수를 가지고

[SolrField("score")] 
public double? Score { get; set; } 
결과 한 경우