Просмотр исходного кода

78577 add elastiSearchInfo to page

Mao 4 лет назад
Родитель
Сommit
20bfa842bf

+ 2 - 4
packages/app/src/components/PageList/Page.jsx

@@ -8,10 +8,10 @@ export default class Page extends React.Component {
 
 
   render() {
   render() {
     const {
     const {
-      page, noLink, matchedPath,
+      page, noLink,
     } = this.props;
     } = this.props;
 
 
-    let pagePathElem = <PagePathLabel page={page} additionalClassNames={['mx-1']} matchedPath={matchedPath} />;
+    let pagePathElem = <PagePathLabel page={page} additionalClassNames={['mx-1']} />;
     if (!noLink) {
     if (!noLink) {
       pagePathElem = <a className="text-break" href={page.path}>{pagePathElem}</a>;
       pagePathElem = <a className="text-break" href={page.path}>{pagePathElem}</a>;
     }
     }
@@ -30,10 +30,8 @@ export default class Page extends React.Component {
 Page.propTypes = {
 Page.propTypes = {
   page: PropTypes.object.isRequired,
   page: PropTypes.object.isRequired,
   noLink: PropTypes.bool,
   noLink: PropTypes.bool,
-  matchedPath: PropTypes.string, // for search result list
 };
 };
 
 
 Page.defaultProps = {
 Page.defaultProps = {
   noLink: false,
   noLink: false,
-  matchedPath: null,
 };
 };

+ 3 - 18
packages/app/src/components/SearchPage/SearchResultList.jsx

@@ -9,18 +9,6 @@ class SearchResultList extends React.Component {
   render() {
   render() {
     return this.props.pages.map((page) => {
     return this.props.pages.map((page) => {
       const pageId = `#${page._id}`;
       const pageId = `#${page._id}`;
-      let snippet = '';
-      if (page.snippet == null) {
-        if (page.contentWithNoKeyword.length >= 40) {
-          snippet = page.contentWithNoKeyword.substr(0, 40);
-        }
-        else {
-          snippet = page.contentWithNoKeyword;
-        }
-      }
-      else {
-        snippet = page.snippet;
-      }
       return (
       return (
         <li key={page._id} className="nav-item page-list-li w-100 m-0 border-bottom">
         <li key={page._id} className="nav-item page-list-li w-100 m-0 border-bottom">
           <a
           <a
@@ -40,12 +28,9 @@ class SearchResultList extends React.Component {
               <input className="form-check-input my-auto" type="checkbox" value="" id="flexCheckDefault" />
               <input className="form-check-input my-auto" type="checkbox" value="" id="flexCheckDefault" />
             </div>
             </div>
             <div className="d-block">
             <div className="d-block">
-              <Page page={page} noLink matchedPath={page.matchedPath} />
-              <div
-                className="border-gray mt-5"
-                dangerouslySetInnerHTML={{ __html: snippet }}
-              >
-              </div>
+              {/* TODO  77750 place component that takes page.elasticSearchResultInfo.matchedPath here */}
+              <Page page={page} noLink />
+              <div className="border-gray mt-5" dangerouslySetInnerHTML={{ __html: page.elasticSearchResultInfo.snippet }}></div>
             </div>
             </div>
             <div className="ml-auto d-flex">
             <div className="ml-auto d-flex">
               {this.props.deletionMode && (
               {this.props.deletionMode && (

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

@@ -159,23 +159,24 @@ module.exports = function(crowi, app) {
       };
       };
       const myXss = new xss.FilterXSS(options);
       const myXss = new xss.FilterXSS(options);
       // add tags snippet data/contentWithNoKeyword and mattched page name to result pages
       // add tags snippet data/contentWithNoKeyword and mattched page name to result pages
-      await Promise.all(findResult.pages.map(async(page) => {
+      findResult.pages.map(async(page) => {
+        const elasticSearchResult = { snippet: '', matchedPath: '' };
         const data = esResult.data.find((data) => { return page.id === data._id });
         const data = esResult.data.find((data) => { return page.id === data._id });
         page._doc.tags = data._source.tag_names;
         page._doc.tags = data._source.tag_names;
         if (data._highlight['body.en'] == null && data._highlight['body.ja'] == null) {
         if (data._highlight['body.en'] == null && data._highlight['body.ja'] == null) {
-          const revision = await Revision.findById(page.revision);
-          page._doc.contentWithNoKeyword = myXss.process(revision.body);
+          elasticSearchResult.snippet = myXss.process(data._source.body);
         }
         }
         else {
         else {
           const snippet = data._highlight['body.en'] == null ? data._highlight['body.ja'] : data._highlight['body.en'];
           const snippet = data._highlight['body.en'] == null ? data._highlight['body.ja'] : data._highlight['body.en'];
-          page._doc.snippet = myXss.process(snippet);
+          elasticSearchResult.snippet = myXss.process(snippet);
         }
         }
         if (data._highlight['path.en'] !== null && data._highlight['path.ja'] !== null) {
         if (data._highlight['path.en'] !== null && data._highlight['path.ja'] !== null) {
           const pathMatch = data._highlight['path.en'] == null ? data._highlight['path.ja'] : data._highlight['path.en'];
           const pathMatch = data._highlight['path.en'] == null ? data._highlight['path.ja'] : data._highlight['path.en'];
-          page._doc.matchedPath = pathMatch;
+          elasticSearchResult.matchedPath = pathMatch;
         }
         }
+        page._doc.elasticSearchResultInfo = elasticSearchResult;
         return page;
         return page;
-      }));
+      });
 
 
       result.meta = esResult.meta;
       result.meta = esResult.meta;
       result.totalCount = findResult.totalCount;
       result.totalCount = findResult.totalCount;
@@ -195,7 +196,6 @@ module.exports = function(crowi, app) {
     catch (err) {
     catch (err) {
       return res.json(ApiResponse.error(err));
       return res.json(ApiResponse.error(err));
     }
     }
-
     return res.json(ApiResponse.success(result));
     return res.json(ApiResponse.success(result));
   };
   };
 
 

+ 1 - 5
packages/ui/src/components/PagePath/PagePathLabel.jsx

@@ -18,9 +18,7 @@ export const PagePathLabel = (props) => {
     ? <><strong>/</strong></>
     ? <><strong>/</strong></>
     : <>{dPagePath.former}/<strong>{dPagePath.latter}</strong></>;
     : <>{dPagePath.former}/<strong>{dPagePath.latter}</strong></>;
 
 
-  if (props.matchedPath !== null) {
-    return <span dangerouslySetInnerHTML={{ __html: props.matchedPath }} />;
-  }
+
   return <span className={classNames.join(' ')}>{textElem}</span>;
   return <span className={classNames.join(' ')}>{textElem}</span>;
 
 
 };
 };
@@ -29,10 +27,8 @@ PagePathLabel.propTypes = {
   page: PropTypes.object.isRequired,
   page: PropTypes.object.isRequired,
   isLatterOnly: PropTypes.bool,
   isLatterOnly: PropTypes.bool,
   additionalClassNames: PropTypes.arrayOf(PropTypes.string),
   additionalClassNames: PropTypes.arrayOf(PropTypes.string),
-  matchedPath: PropTypes.string, // For search result list
 };
 };
 
 
 PagePathLabel.defaultProps = {
 PagePathLabel.defaultProps = {
   additionalClassNames: [],
   additionalClassNames: [],
-  matchedPath: null,
 };
 };