При индексации (ElasticClient.IndexMany()) вызывает исключение StackOverflowException

#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, как вы советовали, и теперь он работает.