コード例 #1
0
        /// <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);
        }