#c# #.net #elasticsearch #indexing #nest
#c# #.net #elasticsearch #индексирование #гнездо
Вопрос:
Раньше я получал свои документы из базы данных таким образом:
private List<Student> GetStudents()
{
using (Context context = new Context(connectionString))
{
return context.Students
.ToList<Student>();
}
}
А затем я проиндексировал некоторые документы с помощью IndexMany(), и все было хорошо.
Но когда я включаю «User»: в мои документы, подобные этому:
private List<Student> GetStudents()
{
using (Context context = new Context(connectionString))
{
return context.Students
.Include(s => s.User)
.ToList<Student>();
}
}
Программа работает до тех пор, пока «клиент.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.
Итак, можете ли вы дать несколько идей, что не так или что я должен попробовать, пожалуйста?
Комментарии:
1. Скорее всего, у вашего пользователя есть ссылка на student, которая имеет ссылку на user и так далее… Исключение StackOverfkowException
Ответ №1:
Как было предложено в комментариях, похоже, что в Student
типах and может быть циклическая ссылка User
. Сериализатор JSON, используемый гнездом 7.x, не обрабатывает циклические ссылки, что привело бы к переполнению стека.
Я бы настоятельно рекомендовал определить простые POCOS для документов, которые будут проиндексированы в Elasticsearch, и сопоставить им типы доменов.
Если вы действительно хотите проиндексировать имеющиеся у вас типы, то вы можете использовать JsonNetSerializer
для этого, который можно настроить для обработки циклических ссылок.
Комментарии:
1. Большое вам спасибо, я использовал JsonNetSerializer, как вы советовали, и теперь он работает.