Раньше я получал свои документы из базы данных следующим образом:
private List<Student> GetStudents()
{
using (Context context = new Context(connectionString))
{
return context.Students
.ToList<Student>();
}
}
Затем я проиндексировал некоторые документы с помощью IndexMany(), и все было хорошо.
Но когда я включаю «Пользователь» в свои документы следующим образом:
private List<Student> GetStudents()
{
using (Context context = new Context(connectionString))
{
return context.Students
.Include(s => s.User)
.ToList<Student>();
}
}
Программа работает до "client.IndexMany(students,studentsIndexName);" а чем кидает «StackOverFlowException» в неизвестном модуле
public int InitializeStudents()
{
string studentsIndexName = "students";
client.Indices.Create(GetStudentMap(studentsIndexName));
List<Student> students = GetStudents();
client.IndexMany(students,studentsIndexName);
return students.Count;
}
У меня около 1000 документов в коллекции и сначала пытался проиндексировать только часть из них (5), но у меня была та же проблема Тогда я подумал, что проблема возникает из-за слишком частого обновления индекса, поэтому я отключил обновление во время индексации, но тоже не помогло
public int InitializeStudents()
{
string studentsIndexName = "students";
client.Indices.Create(GetStudentMap(studentsIndexName).Settings(s => s
.RefreshInterval(-1)
));
List<Student> students = GetStudents();
client.IndexMany(students.Take<Student>(5),studentsIndexName);
client.Indices.UpdateSettings(studentsIndexName, s => s.IndexSettings(o => o.RefreshInterval(1)));
return students.Count;
}
private static CreateIndexDescriptor GetStudentMap(string indexName)
{
CreateIndexDescriptor map = new CreateIndexDescriptor(indexName);
map.Mappings(M => M
.Map<Student>(m => m
.Properties(prop => prop
.Text(s => s
.Name(n => n.FullName)
)
.Object<User>(o => o
.Name(s => s.User)
)
.Number(s => s
.Name(n => n.Id)
.Type(NumberType.Integer)
)
)
)
)
;
return map;
}
Я использую Elasticsearch.Net 7.10 и EntityFramework 5.0. Итак, можете ли вы дать несколько идей, что не так или что мне попробовать, пожалуйста?
Как было предложено в комментариях, похоже, что в типах Student
и User
может быть циклическая ссылка. Сериализатор JSON, используемый NEST 7.x, не обрабатывает циклические ссылки, что может привести к переполнению стека.
Я настоятельно рекомендую определить простые POCO для документов, которые будут проиндексированы в Elasticsearch, и сопоставить с ними типы доменов.
Если вы действительно хотите индексировать имеющиеся у вас типы, вы можете использовать для этого JsonNetSerializer , который можно настроить для обработки циклических ссылок.
Большое спасибо, я использовал JsonNetSerializer, как вы посоветовали, и теперь он работает.
Скорее всего, у вашего пользователя есть ссылка на студента, у которого есть ссылка на пользователя и т.д.... StackOverfkowException