/// <summary> /// 重建索引 /// </summary> public void RebuildIndex() { //pageSize参数决定了每次批量取多少条数据进行索引。要注意的是,如果是分布式搜索,客户端会将这部分数据通过WCF传递给服务器端,而WCF默认的最大传输数据量是65535B,pageSize较大时这个设置显然是不够用的,WCF会报400错误;系统现在将最大传输量放宽了,但仍要注意一次不要传输过多,如遇异常,可适当调小pageSize的值 int pageSize = 1000; int pageIndex = 1; long totalRecords = 0; bool isBeginning = true; bool isEndding = false; UserQuery query = new UserQuery(); do { Dictionary <long, dynamic> userDictionary = new Dictionary <long, dynamic>(); //分页获取用户列表 PagingDataSet <User> users = userService.GetUsers(query, pageSize, pageIndex); totalRecords = users.TotalRecords; isEndding = (pageSize * pageIndex < totalRecords) ? false : true; List <long> userIds = new List <long>(); //以用户id为key,存入字典类 foreach (User user in users.ToList <User>()) { //构建动态对象,用于存放用户搜索相关字段 dynamic dUser = new ExpandoObject(); dUser.UserId = user.UserId; dUser.UserName = user.UserName; dUser.TrueName = user.TrueName; dUser.NickName = user.NickName; dUser.DateCreated = user.DateCreated; dUser.LastActivityTime = user.LastActivityTime; //初始化动态对象 dUser.Gender = null; dUser.Birthday = null; dUser.LunarBirthday = null; dUser.BirthdayType = null; dUser.NowAreaCode = null; dUser.HomeAreaCode = null; dUser.AvatarImage = null; dUser.Introduction = null; dUser.Schools = new List <string>(); dUser.CompanyNames = new List <string>(); dUser.TagNames = new List <string>(); dUser.AvatarImage = user.Avatar; userDictionary.Add(user.UserId, dUser); userIds.Add(user.UserId); } //根据用户id列表查询基本资料 IEnumerable <UserProfile> userProfiles = userProfileService.GetUserProfiles(userIds); foreach (UserProfile userProfile in userProfiles) { dynamic dUser = userDictionary[userProfile.UserId]; dUser.Gender = userProfile.Gender; dUser.Birthday = userProfile.Birthday; dUser.LunarBirthday = userProfile.LunarBirthday; dUser.BirthdayType = userProfile.BirthdayType; dUser.NowAreaCode = userProfile.NowAreaCode; dUser.HomeAreaCode = userProfile.HomeAreaCode; dUser.Introduction = userProfile.Introduction; } //根据用户id列表查询教育经历 IEnumerable <long> educationExperienceIds = userProfileService.GetEducationExperienceIdsByUserIds(userIds); IEnumerable <EducationExperience> educationExperiences = userProfileService.GetEducationExperiences(educationExperienceIds); foreach (EducationExperience educationExperience in educationExperiences) { dynamic dUser = userDictionary[educationExperience.UserId]; dUser.Schools.Add(educationExperience.School); } //根据用户id列表查询工作经历 IEnumerable <long> workExperienceIds = userProfileService.GetWorkExperienceIdsByUserIds(userIds); IEnumerable <WorkExperience> workExperiences = userProfileService.GetWorkExperiences(workExperienceIds); foreach (WorkExperience workExperience in workExperiences) { dynamic dUser = userDictionary[workExperience.UserId]; dUser.CompanyNames.Add(workExperience.CompanyName); } //根据用户id列表查询tags //fixed by jiangshl,修改了方法名,此处是为了性能考虑,以用户ID列表为参数,批量查询出对应的ItemInTag的ID,再批量查询出ItemInTag实体 IEnumerable <long> itemInTagIds = tagService.GetItemInTagIdsByItemIds(userIds); IEnumerable <ItemInTag> itemInTags = tagService.GetItemInTags(itemInTagIds); foreach (ItemInTag itemInTag in itemInTags) { dynamic dUser = userDictionary[itemInTag.ItemId]; dUser.TagNames.Add(itemInTag.TagName); } //重建索引 List <dynamic> userList = new List <dynamic>(); userList.AddRange(userDictionary.Values); IEnumerable <Document> docs = UserIndexDocument.Convert(userList); searchEngine.RebuildIndex(docs, isBeginning, isEndding); isBeginning = false; pageIndex++; }while (!isEndding); }