我以前是这样从数据库里取文件的:
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。那么你能给我一些想法吗?我该怎么做?
1条答案
按热度按时间mwkjh3gx1#
正如评论中所建议的,这听起来像是一个循环引用
Student
以及User
类型。Nest7.x使用的json序列化程序不处理循环引用,这将导致堆栈溢出。我强烈建议为将被编入elasticsearch的文档定义简单的poco,并将域类型Map到这些poco。
如果您真的想索引您拥有的类型,那么您可以使用
JsonNetSerializer
为此,可以将其配置为处理循环引用。