2013-11-28 6 views
-1

Я застрял в ручном сопоставлении в solrnet, и я не могу объяснить поведение после поиска в течение 2 часов. Я использую ручное сопоставление для создания моей схемы, и все работает отлично, кроме того, я продолжаю получать ошибки, когда я пытаюсь проверить мое сопоставление. Когда я запускаю запросы, свойства целевых объектов являются пустыми или пустыми.Проблема с solrnet, ручными сопоставлениями и обязательными полями

Я пытаюсь сделать это, поскольку мне нужно разработать общий слой перед solrnet, который должен использоваться в моих различных приложениях, поэтому мы хотим избежать использования метатегов в бизнес-объектах.

Ошибки относятся к обязательным полям, которые будут отсутствовать, но на самом деле я их сопоставляю как другие поля. Ошибка Mapping:

Required field 'doc_id' in the Solr schema is not mapped in type 'Wise.ClientService.SkbDoc'. 
Required field 'author' in the Solr schema is not mapped in type 'Wise.ClientService.SkbDoc'. 

И так далее, 5 обязательные поля, 5 ошибок.

Ниже я предоставляю свою схему и настройку для отображения типов. Если кто-нибудь знает, что происходит не так, я высоко ценю ... Спасибо заранее,

Markus

Поля схемы, схема уже и работает на сервере Solr, 3000 тестовых документов были также успешно загружен:

<field name="_root_" type="string" indexed="true" stored="false"/> 
<field name="doc_id"     type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="author"     type="string" indexed="true" stored="true" required="true" /> 
<field name="author_gid"    type="string" indexed="true" stored="true" required="true" /> 
<field name="applies_to"    type="string" indexed="true" stored="false" required="false" /> 
<field name="creation_date"   type="date"  indexed="true" stored="true" required="true" /> 
<field name="archive_date"    type="date"  indexed="true" stored="true" required="false" /> 
<field name="doc_acl"     type="int"  indexed="true" stored="true" required="false" /> 
<field name="doc_status"    type="string" indexed="true" stored="true" required="false" /> 






Базовый класс для моей схемы. (Doc стоит для моего класса Document)

public abstract class Schema 
{ 
    protected Schema() 
    { 
     this.Fields    = new List<Field>(); 
     this.fieldDictionary  = new Dictionary<PropertyInfo, Field>(); 
     this.fieldNameDictionary = new Dictionary<PropertyInfo, string>(); 
    } 

    public List<IMappingExpression> FieldMap; 
    public List<Field> Fields { get; set; } 
    public Field KeyField { get; set; } 

    private readonly Dictionary<PropertyInfo, Field> fieldDictionary; 
    private readonly Dictionary<PropertyInfo, string> fieldNameDictionary; 

    public abstract void BuildMap(); 


    public Schema Add(PropertyInfo property, string fieldName) 
    { 
     var field = new Field(fieldName, property); 
     this.Fields.Add(field); 
     this.fieldDictionary.Add(property,field); 
     this.fieldNameDictionary.Add(property,fieldName); 
     return this; 
    } 

    public PropertyInfo GetPropertyFor(string propertyName) 
    { 
     PropertyInfo property = null; 
     List<Field> findAll = this.Fields.FindAll(match => match.Property.Name == propertyName); 
     if (findAll.Count>1) 
     { 
      throw new Exception("property names have to be unique!"); 
     } 
     if (findAll.Count==1) 
     { 
      property = findAll[0].Property; 
     } 
     return property; 
    } 

    public Field GetFieldFor(PropertyInfo property) 
    { 
     Field returnValue = null; 

     if (!this.fieldDictionary.TryGetValue(property,out returnValue)) 
     { 
      throw new IndexOutOfRangeException("unknown property!"); 
     } 
     return returnValue; 
    } 

    public string GetFieldNameFor(PropertyInfo property) 
    { 
     string returnValue = null; 

     if (!this.fieldNameDictionary.TryGetValue(property, out returnValue)) 
     { 
      throw new IndexOutOfRangeException("unknown property!"); 
     } 
     return returnValue; 
    } 

    //TODO: add default search field for default query behaviour 


} 



public class DocSchema : Schema 
{ 
    public DocSchema() 
    { 
     this.BuildMap(); 
    } 

    public override void BuildMap() 
    { 
     var keyProperty = GetPropertyInfo("DocId"); 

     this.KeyField = new Field("doc_id",keyProperty); 
     //this.Add(keyProperty, "doc_id"); 

     this.Add(GetPropertyInfo("Author"), "author"); 
     this.Add(GetPropertyInfo("AppliesTo"), "applies_to"); 
     this.Add(GetPropertyInfo("AuthorGid"), "author_gid"); 
     this.Add(GetPropertyInfo("CreationDate"), "creation_date"); 
     this.Add(GetPropertyInfo("ArchiveDate"), "archive_date"); 
     this.Add(GetPropertyInfo("Description"), "description"); 
     this.Add(GetPropertyInfo("DocAcl"), "doc_acl"); 
     this.Add(GetPropertyInfo("DocStatus"), "doc_status"); 
     this.Add(GetPropertyInfo("DocLinks"), "doc_links"); 
     this.Add(GetPropertyInfo("DocType"), "doc_type"); 
     this.Add(GetPropertyInfo("Hits"), "hits"); 
     this.Add(GetPropertyInfo("InternalInformation"), "internal_information"); 
     this.Add(GetPropertyInfo("Modality"), "modality"); 
     this.Add(GetPropertyInfo("InternalInformationAcl"), "internal_information_acl"); 
     this.Add(GetPropertyInfo("ModifyDate"), "modify_date"); 
     this.Add(GetPropertyInfo("ProductName"), "product_name"); 
     this.Add(GetPropertyInfo("PublishDate"), "publish_date"); 
     this.Add(GetPropertyInfo("Publisher"), "publisher"); 
     this.Add(GetPropertyInfo("PublisherGid"), "publisher_gid"); 
     this.Add(GetPropertyInfo("PublishStatus"), "publish_status"); 
     this.Add(GetPropertyInfo("Rating"), "parent_doc_id"); 
     this.Add(GetPropertyInfo("ParentDocId"), "rating"); 
     this.Add(GetPropertyInfo("Resolution"), "resolution"); 
     this.Add(GetPropertyInfo("Title"), "title"); 
     this.Add(GetPropertyInfo("ReviewDate"), "review_date"); 
     this.Add(GetPropertyInfo("Products"), "products"); 
     this.Add(GetPropertyInfo("ImageNames"), "image_names"); 
     this.Add(GetPropertyInfo("AttachmentNames"), "attachment_names"); 
     this.Add(GetPropertyInfo("Attachments"), "attachments"); 
     this.Add(GetPropertyInfo("Text"), "text"); 
     this.Add(GetPropertyInfo("TextRev"), "text_rev"); 
     this.Add(GetPropertyInfo("Images"), "images"); 

    } 

    private PropertyInfo GetPropertyInfo(string fieldName) 
    { 
     var property = typeof(Doc).GetProperty(fieldName); 
     return property; 
    } 
} 

И получает отображается в solrnet так:

public class SolrSchemaRegistrator : ISchemaRegistrator 
{ 
    public void Register(Schema schema) 
    { 
     MappingService.Instance.MappingManager.Add(schema.KeyField.Property, schema.KeyField.FieldName); 
     MappingService.Instance.MappingManager.SetUniqueKey(schema.KeyField.Property); 

     foreach (Field field in schema.Fields) 
     { 
      MappingService.Instance.MappingManager.Add(field.Property, field.FieldName); 
     } 

     var container = new Container(Startup.Container); 
     container.RemoveAll<IReadOnlyMappingManager>(); 
     container.Register<IReadOnlyMappingManager>(c => MappingService.Instance.MappingManager); 
    } 
} 

Но когда я проверяю отображение как это:

Startup.Init<Doc>("http://localhost:8983/solr"); 
     ISolrOperations<Doc> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Doc>>(); 

     IList<ValidationResult> mismatches = solr.EnumerateValidationResults().ToList(); 
     var errors = mismatches.OfType<ValidationError>(); 
     var warnings = mismatches.OfType<ValidationWarning>(); 
     foreach (var error in errors) 
      Debug.WriteLine("Mapping error: " + error.Message); 
     foreach (var warning in warnings) 
      Debug.WriteLine("Mapping warning: " + warning.Message); 
     if (errors.Any()) 
      throw new Exception("Mapping errors, aborting"); 

я получаю следующие данные:

Mapping error: Required field 'doc_id' in the Solr schema is not mapped in type 'Wise.ClientService.SkbDoc'. 
Mapping error: Required field 'author' in the Solr schema is not mapped in type 'Wise.ClientService.SkbDoc'. 
Mapping error: Required field 'author_gid' in the Solr schema is not mapped in type 'Wise.ClientService.SkbDoc'. 
Mapping error: Required field 'creation_date' in the Solr schema is not mapped in type 'Wise.ClientService.SkbDoc' 

И я действительно не понимаю ... Я упоминал, что MappingManager solrnet хорошо выглядит в отладчике, имея правильное количество полей?

+0

https://github.com/mausch/SolrNet/issues/117 –

ответ

0

Mauricio Scheffer на самом деле решил это для меня, отсутствовала линия для регистрации контейнера.

ссылка здесь показывает решение: https://github.com/mausch/SolrNet/issues/117

и здесь полный код

var mapper = new MappingManager(); 
    /* Here come your mappings */ 
    var container = new Container(Startup.Container); 
    container.RemoveAll<IReadOnlyMappingManager>(); 
    container.Register<IReadOnlyMappingManager>(c => mapper); 
    ServiceLocator.SetLocatorProvider(() => container); 
    Startup.Init<Document>("http://localhost:8983/solr");