索引时(elasticclient.indexmany())抛出stackoverflowexception

f1tvaqid  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(288)

我以前是这样从数据库里取文件的:

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。那么你能给我一些想法吗?我该怎么做?

mwkjh3gx

mwkjh3gx1#

正如评论中所建议的,这听起来像是一个循环引用 Student 以及 User 类型。Nest7.x使用的json序列化程序不处理循环引用,这将导致堆栈溢出。
我强烈建议为将被编入elasticsearch的文档定义简单的poco,并将域类型Map到这些poco。
如果您真的想索引您拥有的类型,那么您可以使用 JsonNetSerializer 为此,可以将其配置为处理循环引用。

相关问题