2012-05-08 3 views
1

Я использую SolrNet и имею проблему, когда поле оценки конфликтует с добавлением или обновлением документов в индексе.Использование поля оценки с 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) при добавлении или обновлении документов, а также использовать его только когда получение документов.

Есть ли способ достичь этого?

ответ

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

Убедитесь, что вы инициализируете оба класса, указывающие на один и тот же URL-адрес solr. 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"); 

Вы также можете посмотреть в использовании Dynamic or Fully Loose Mapping варианты SolrNet, если вы не хотите, чтобы создать два отдельных класса.

2

Если вы сделаете свой класс ПОКО имеет показатель как обнуляемые вы можете использовать один и тот же объект для индексирования и результаты

[SolrField("score")] 
public double? Score { get; set; }