Kaynağa Gözat

refs #82628: fix search keyword result sorting
- Change sorting logic from score to esResult order

NEEDLEMAN3\tatsu 4 yıl önce
ebeveyn
işleme
61eaf3cb2e

+ 22 - 22
packages/app/src/server/routes/search.js

@@ -110,7 +110,9 @@ module.exports = function(crowi, app) {
    */
   api.search = async function(req, res) {
     const user = req.user;
-    const { q: keyword = null, type = null } = req.query;
+    const {
+      q: keyword = null, type = null, sort = null, order = null,
+    } = req.query;
     let paginateOpts;
 
     try {
@@ -135,7 +137,9 @@ module.exports = function(crowi, app) {
       userGroups = await UserGroupRelation.findAllUserGroupIdsRelatedToUser(user);
     }
 
-    const searchOpts = { ...paginateOpts, type };
+    const searchOpts = {
+      ...paginateOpts, type, sort, order,
+    };
 
     const result = {};
     try {
@@ -147,33 +151,29 @@ module.exports = function(crowi, app) {
       // key: id , value: score
       const scoreMap = {};
       for (const esPage of esResult.data) {
-        scoreMap[esPage._id] = esPage._score;
+        scoreMap[esPage._id] = esResult.indexOf(esPage);
       }
 
       const ids = esResult.data.map((page) => { return page._id });
       const findResult = await Page.findListByPageIds(ids);
 
-      // add tags data to page
-      findResult.pages.map((pageData) => {
-        const data = esResult.data.find((data) => {
-          return pageData.id === data._id;
-        });
-        pageData._doc.tags = data._source.tag_names;
-        return pageData;
-      });
-
       result.meta = esResult.meta;
       result.totalCount = findResult.totalCount;
-      result.data = findResult.pages
-        .map((pageData) => {
-          if (pageData.lastUpdateUser != null && pageData.lastUpdateUser instanceof User) {
-            pageData.lastUpdateUser = serializeUserSecurely(pageData.lastUpdateUser);
-          }
 
-          const data = esResult.data.find((data) => {
+      result.data = esResult.data
+        .map((data) => {
+          const pageData = findResult.pages.find((pageData) => {
             return pageData.id === data._id;
           });
 
+          // add tags data to page
+          pageData._doc.tags = data._source.tag_names;
+
+          // add lastUpdateUser data to page
+          if (pageData.lastUpdateUser != null && pageData.lastUpdateUser instanceof User) {
+            pageData.lastUpdateUser = serializeUserSecurely(pageData.lastUpdateUser);
+          }
+
           const pageMeta = {
             bookmarkCount: data._source.bookmark_count || 0,
             elasticSearchResult: data.elasticSearchResult,
@@ -182,10 +182,10 @@ module.exports = function(crowi, app) {
           pageData._doc.seenUserCount = (pageData.seenUsers && pageData.seenUsers.length) || 0;
 
           return { pageData, pageMeta };
-        })
-        .sort((page1, page2) => {
-          // note: this do not consider NaN
-          return scoreMap[page2._id] - scoreMap[page1._id];
+        // })
+        //   .sort((page1, page2) => {
+        //     // note: this do not consider NaN
+        //     return scoreMap[page2.pageData._id] - scoreMap[page1.pageData._id];
         });
     }
     catch (err) {

+ 1 - 0
packages/app/src/server/service/search-delegator/elasticsearch.js

@@ -901,6 +901,7 @@ class ElasticsearchDelegator {
     const from = option.offset || null;
     const size = option.limit || null;
     const type = option.type || null;
+    // default sort order is score descending
     const sort = option.sort || '_score';
     const order = option.order || 'desc';
     const query = this.createSearchQuery(sort, order);