Я застрял в ручном сопоставлении в 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 хорошо выглядит в отладчике, имея правильное количество полей?
https://github.com/mausch/SolrNet/issues/117 –