diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index 326255d..c2562bc 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -27,6 +27,7 @@
 import entity.User;
 import entity.Post;
 import entity.PostReply;
+import entity.UserPT;
 
 import java.util.UUID;
 
@@ -548,7 +549,6 @@
             // 添加 replies 数组
             com.fasterxml.jackson.databind.node.ArrayNode repliesArray = mapper.createArrayNode();
             if (replies != null) {
-                System.out.println("Replies count: " + replies.length);
                 for (PostReply reply : replies) {
                     com.fasterxml.jackson.databind.node.ObjectNode replyJson = mapper.createObjectNode();
                     replyJson.put("replyid", reply.replyid);
@@ -602,7 +602,6 @@
         @RequestBody String requestBody
     ) {
         try {
-            System.out.println("Add reply request body: " + requestBody);
             // 解析 JSON 数据
             com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
             com.fasterxml.jackson.databind.JsonNode postidNode = jsonNode.get("postid");
@@ -617,10 +616,6 @@
             String authorid = authoridNode.asText();
             String content = contentNode.asText();
 
-            System.out.println("Post ID: " + postid);
-            System.out.println("Author ID: " + authorid);
-            System.out.println("Content: " + content);
-
             // 参数验证
             if (postid == null || postid.trim().isEmpty() || 
                 authorid == null || authorid.trim().isEmpty() || 
@@ -629,7 +624,6 @@
             }
             
             int ret = db1.AddComment(postid, authorid, content);
-            System.out.println("Add comment result: " + ret);
             if (ret == 0) {
                 return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
             } else {
@@ -649,20 +643,74 @@
         @RequestParam("tag") String tag,
         @RequestParam("keyword") String query
     ) {
-        return null;
-    //     try {
-    //         Seed[] seeds = db1.SearchSeeds(query);
-    //         if (seeds == null || seeds.length == 0) {
-    //             return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
-    //         }
-    //         String json = mapper.writeValueAsString(seeds);
-    //         return new ResponseEntity<>(json, headers, HttpStatus.OK);
-    //     } catch (JsonProcessingException e) {
-    //         e.printStackTrace();
-    //         return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
-    //     } catch (Exception e) {
-    //         e.printStackTrace();
-    //         return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
-    //     }
+        try {
+            Seed[] seeds = db1.SearchSeed(query);
+            if (seeds == null || seeds.length == 0) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到种子
+            }
+            
+            // 过滤掉与前端要求tag不同的种子
+            java.util.List<Seed> filteredSeeds = new java.util.ArrayList<>();
+            for (Seed seed : seeds) {
+                if (seed.seedtag != null && seed.seedtag.equals(tag)) {
+                    filteredSeeds.add(seed);
+                }
+            }
+            
+            // 如果过滤后没有匹配的种子，返回空数组
+            if (filteredSeeds.isEmpty()) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND);
+            }
+            
+            Seed[] filteredSeedsArray = filteredSeeds.toArray(new Seed[0]);
+            String json = mapper.writeValueAsString(filteredSeedsArray);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> searchPosts(
+        @RequestParam("keyword") String query
+    ) {
+        try {
+            Post[] posts = db1.SearchPost(query);
+            if (posts == null || posts.length == 0) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到帖子
+            }
+            String json = mapper.writeValueAsString(posts);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getUserPT(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            UserPT userPT = db1.GetInformationPT(userid);
+            if (userPT == null) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到用户PT信息
+            }
+            String json = mapper.writeValueAsString(userPT);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
     }
 }
\ No newline at end of file
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index d2e804b..2d79fa7 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -91,4 +91,14 @@
         @RequestParam("tag") String tag,
         @RequestParam("keyword") String query
     );
+
+    @GetMapping("/search-posts")
+    ResponseEntity<String> searchPosts(
+        @RequestParam("keyword") String query
+    );
+
+    @GetMapping("/get-userpt")
+    ResponseEntity<String> getUserPT(
+        @RequestParam("userid") String userid
+    );
 }
\ No newline at end of file
diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index 357b81f..b02f4a6 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -51,6 +51,7 @@
     public int SubmitSeed(String begid,Seed seed);//提交种子，返回状态：0 success，1 重复，2其他原因
     public void SettleBeg();//结算所有求种信息，求种信息中需要增加Beg截止日期，默认14天，期间投票>的则Beg成功，否则Beg失败，并发放对应奖励
 
+    public Post[] SearchPost(String userQ);//传入搜索的关键词或句子，返回搜索到的帖子信息（按照公共字符数量排序）
     public Post[] GetPostList();//获取用户的帖子列表
     public Post GetPost(String postid);//获取一个帖子的详细信息
     public PostReply[] GetPostReplyList(String postid);//获取一个帖子的回复列表
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index 580f9e8..b91e471 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -39,15 +39,15 @@
 import entity.config;
 import entity.PostReply;
 import entity.QPostReply;
+import entity.UserInvite;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class Database1 implements DataManagerInterface {
-    @PersistenceContext
-    private final EntityManager entitymanager;
     private static final Logger logger = LoggerFactory.getLogger(Database1.class);
     private EntityManagerFactory emf;
+    
     public Database1() {
         config cfg = new config();
         Map<String,Object> props = new HashMap<>();
@@ -55,9 +55,15 @@
                   "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
         props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
         props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
-        this.entitymanager = Persistence.createEntityManagerFactory("myPersistenceUnit", props).createEntityManager();
-        // this.emf=entitymanager;
+        // 只创建一个 EntityManagerFactory，为每个操作创建新的 EntityManager
+        this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
     }
+    
+    // 为每个操作创建新的 EntityManager 以避免线程安全问题
+    private EntityManager createEntityManager() {
+        return emf.createEntityManager();
+    }
+
     @Override
     public String LoginUser(User userinfo){
         try {
@@ -73,6 +79,7 @@
                 return null;
             }
             
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             User foundUser = null;
@@ -97,14 +104,15 @@
     // 返回状态：0 success，1 邮箱重复，2其他原因
     @Override
     public int RegisterUser(User userinfo){
+        EntityManager entitymanager = createEntityManager();
         try{
             // 首先检查该邮箱是否在UserInvite表中被邀请过
-            JPAQuery<String> inviteQuery = new JPAQuery<>(entitymanager);
+            JPAQuery<UserInvite> inviteQuery = new JPAQuery<>(entitymanager);
             QUserInvite ui = QUserInvite.userInvite;
-            List<String> invitedEmails = inviteQuery.select(ui.inviterEmail).from(ui).fetch();
+            List<UserInvite> UserInvites = inviteQuery.select(ui).from(ui).where(ui.inviterEmail.eq(userinfo.email)).fetch();
 
             // 如果邮箱不在被邀请列表中，拒绝注册
-            if(!invitedEmails.contains(userinfo.email)){
+            if(UserInvites.isEmpty()){
                 return 2; // 未被邀请
             }
 
@@ -117,8 +125,23 @@
                 return 1; // 邮箱重复
             }
 
+            UserPT userPT = new UserPT();
+            userPT.userid = userinfo.userid;
+            userPT.magic = 0; // 设置默认值
+            userPT.upload = 0; // 设置默认值
+            userPT.download = 0; // 设置默认值
+            userPT.share = 0.0; // 设置默认值
+            userPT.user = userinfo; // 设置关联关系
+            userPT.farmurl = ""; // 设置默认值
+            userPT.viptime = 0; // 设置默认值
+
             entitymanager.getTransaction().begin();
             entitymanager.persist(userinfo);
+            entitymanager.persist(userPT);
+            // 删除所有匹配的邀请记录
+            for (UserInvite invite : UserInvites) {
+                entitymanager.remove(invite);
+            }
             entitymanager.getTransaction().commit();
             return 0; // 注册成功
 
@@ -135,11 +158,12 @@
     // 返回状态：0 success，1 不存在，2其他原因
     @Override
     public int UpdateInformation(User userinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             if (userinfo.userid == null) {
                 return 2; // userid为null直接返回错误
             }
-            
+
             entitymanager.getTransaction().begin();
             
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
@@ -177,6 +201,7 @@
     // 返回用户的全部基本信息
     @Override
     public User GetInformation(String userid){
+        EntityManager entitymanager = createEntityManager();
         User user = entitymanager.find(User.class, userid);
         return user;
     }
@@ -184,6 +209,7 @@
     //返回用户的全部pt站信息
     @Override
     public UserPT GetInformationPT(String userid){
+        EntityManager entitymanager = createEntityManager();
         UserPT userPT = entitymanager.find(UserPT.class, userid);
         return userPT;
     }
@@ -192,6 +218,7 @@
     @Override
     public int UpdateInformationPT(UserPT userinfo){
         try{
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
             QUserPT u = QUserPT.userPT;
             UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
@@ -212,6 +239,7 @@
     //返回状态：0 success，1 id重复，2其他原因
     @Override
     public int RegisterUserPT(UserPT userinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             
@@ -238,30 +266,58 @@
     //返回种子的全部信息
     @Override
     public Seed GetSeedInformation(String seedid){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        Seed seed = query.select(s).from(s).where(s.seedid.eq(seedid)).fetchOne();
-        return seed;
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            Seed seed = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seedid.eq(seedid)).fetchOne();
+            return seed;
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public Seed[] GetSeedListByTag(String tag){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).where(s.seedtag.eq(tag)).fetch();
-        return seeds.toArray(new Seed[0]);
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seedtag.eq(tag)).fetch();
+            return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public Seed[] GetSeedListByUser(String userid){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).where(s.seeduserid.eq(userid)).fetch();
-        return seeds.toArray(new Seed[0]);
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seeduserid.eq(userid)).fetch();
+            return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public int DeleteSeed(String seedid){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             Seed seed = entitymanager.find(Seed.class, seedid);
@@ -284,6 +340,7 @@
     //添加一个新的种子，0成功，其他失败信息待定;
     @Override
     public int RegisterSeed(Seed seedinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
@@ -315,6 +372,7 @@
     @Override
     public int UpdateSeed(Seed seedinfo){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
@@ -333,28 +391,37 @@
     //传入搜索的关键词或句子，返回搜索到的种子信息（按照公共字符数量排序）
     @Override
     public Seed[] SearchSeed(String userQ){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).fetch();
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .fetch();
 
-        if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+            if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+                return seeds.toArray(new Seed[0]);
+            }
+
+            String processedQuery = userQ.toLowerCase().trim();
+            Map<Seed, Integer> seedCountMap = new HashMap<>();
+            for(Seed seed : seeds){
+                String title = seed.title.toLowerCase().trim();
+                int count = countCommonCharacter(processedQuery, title);
+                seedCountMap.put(seed, count);
+            }
+            seeds.sort((s1, s2) -> {
+                int count1 = seedCountMap.getOrDefault(s1, 0);
+                int count2 = seedCountMap.getOrDefault(s2, 0);
+                return Integer.compare(count2, count1);
+            });
+
             return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
         }
-
-        String processedQuery = userQ.toLowerCase().trim();
-        Map<Seed, Integer> seedCountMap = new HashMap<>();
-        for(Seed seed : seeds){
-            String title = seed.title.toLowerCase().trim();
-            int count = countCommonCharacter(processedQuery, title);
-            seedCountMap.put(seed, count);
-        }
-        seeds.sort((s1, s2) -> {
-            int count1 = seedCountMap.getOrDefault(s1, 0);
-            int count2 = seedCountMap.getOrDefault(s2, 0);
-            return Integer.compare(count2, count1);
-        });
-
-        return seeds.toArray(new Seed[0]);
     }
 
     //计算字符串公共字符数量
@@ -388,6 +455,7 @@
     @Override
     public int AddNotice(Notice notice){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
             QNotice n = QNotice.notice;
             Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
@@ -408,6 +476,7 @@
     @Override
     public boolean UpdateNotice(Notice notice){
         try {
+            EntityManager entitymanager = createEntityManager();
             Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
             if (oldNotice == null) {
                 return false;
@@ -425,6 +494,7 @@
     @Override
     public boolean DeleteNotice(String noticeid){
         try {
+            EntityManager entitymanager = createEntityManager();
             Notice notice = entitymanager.find(Notice.class, noticeid);
             if (notice == null) {
                 return false;
@@ -441,6 +511,7 @@
     //获取用户的剩余邀请次数
     public int GetUserAvailableInviteTimes(String userid){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
@@ -457,6 +528,7 @@
     @Override
     public int InviteUser(String inviterid,String inviteemail){
         try {
+            EntityManager entitymanager = createEntityManager();
             User user = entitymanager.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
@@ -477,6 +549,7 @@
     //添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
     public boolean AddCollect(String userid,String seedid){
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
         QUser u2 = QUser.user;
         User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
@@ -507,6 +580,7 @@
     @Override
     public boolean DeleteCollect(String userid,String seedid){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
@@ -532,6 +606,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -577,6 +652,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -619,6 +695,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -657,6 +734,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -717,6 +795,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -771,6 +850,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -844,6 +924,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -894,6 +975,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -1426,6 +1508,7 @@
 
     @Override
     public Post[] GetPostList() {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<Post> query = new JPAQuery<>(entitymanager);
         QPost p = QPost.post;
         List<Post> posts = query.select(p).from(p).fetch();
@@ -1434,6 +1517,7 @@
 
     @Override
     public Post GetPost(String postid) {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<Post> query = new JPAQuery<>(entitymanager);
         QPost p = QPost.post;
         Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
@@ -1442,10 +1526,38 @@
 
     @Override
     public PostReply[] GetPostReplyList(String postid) {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<PostReply> query = new JPAQuery<>(entitymanager);
         QPostReply p = QPostReply.postReply;
         List<PostReply> replies = query.select(p).from(p).where(p.postid.eq(postid)).fetch();
         return replies.toArray(new PostReply[0]);
     }
+
+    @Override
+    public Post[] SearchPost(String postQ) {
+        EntityManager entitymanager = createEntityManager();
+        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+        QPost p = QPost.post;
+        List<Post> posts = query.select(p).from(p).fetch();
+
+        if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+            return posts.toArray(new Post[0]);
+        }
+
+        String processedQuery = postQ.toLowerCase().trim();
+        Map<Post, Integer> postCountMap = new HashMap<>();
+        for(Post post : posts){
+            String title = post.posttitle.toLowerCase().trim();
+            int count = countCommonCharacter(processedQuery, title);
+            postCountMap.put(post, count);
+        }
+        posts.sort((s1, s2) -> {
+            int count1 = postCountMap.getOrDefault(s1, 0);
+            int count2 = postCountMap.getOrDefault(s2, 0);
+            return Integer.compare(count2, count1);
+        });
+
+        return posts.toArray(new Post[0]);
+    }
 }
 
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index d7c5eee..0166081 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -1116,4 +1116,9 @@
     public PostReply[] GetPostReplyList(String postid) {
         return null;
     }
+
+    @Override
+    public Post[] SearchPost(String userQ) {
+        return null;
+    }
 }
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 2e8b0a3..bafddce 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1 +1 @@
-server.port=8111
\ No newline at end of file
+server.port=8081
\ No newline at end of file
