Taichi Masuyama 4 лет назад
Родитель
Сommit
84e9aa55bb

+ 8 - 4
packages/app/src/server/interfaces/search.ts

@@ -15,7 +15,6 @@ export type QueryTerms = {
 
 
 export type ParsedQuery = {
 export type ParsedQuery = {
   queryString: string // original query string in request
   queryString: string // original query string in request
-  terms: QueryTerms // terms found in query string
   nqNames: string[] // possible NamedQuery names found in query string
   nqNames: string[] // possible NamedQuery names found in query string
 }
 }
 
 
@@ -23,13 +22,13 @@ export interface SearchQueryParser {
   parseSearchQuery(queryString: string): Promise<ParsedQuery>
   parseSearchQuery(queryString: string): Promise<ParsedQuery>
 }
 }
 
 
-export interface SearchResolver {
-  resolve(parsedQuery: ParsedQuery): Promise<SearchDelegator>
+export interface SearchResolver{
+  resolve(parsedQuery: ParsedQuery): Promise<[SearchDelegator, SearchableData]>
 }
 }
 
 
 export interface SearchDelegator<T = unknown> {
 export interface SearchDelegator<T = unknown> {
   name?: SearchDelegatorName
   name?: SearchDelegatorName
-  search(queryString: string | null, user, userGroups, option): Promise<Result<T> & MetaData>
+  search(data: SearchableData | null, user, userGroups, option): Promise<Result<T> & MetaData>
 }
 }
 
 
 export type Result<T> = {
 export type Result<T> = {
@@ -39,3 +38,8 @@ export type Result<T> = {
 export type MetaData = {
 export type MetaData = {
   meta: { [key:string]: any }
   meta: { [key:string]: any }
 }
 }
+
+export type SearchableData = {
+  queryString: string
+  terms: QueryTerms
+}

+ 8 - 7
packages/app/src/server/service/search-delegator/elasticsearch.ts

@@ -9,7 +9,9 @@ import streamToPromise from 'stream-to-promise';
 import { createBatchStream } from '../../util/batch-stream';
 import { createBatchStream } from '../../util/batch-stream';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 import { PageDocument, PageModel } from '../../models/page';
 import { PageDocument, PageModel } from '../../models/page';
-import { MetaData, SearchDelegator, Result } from '../../interfaces/search';
+import {
+  MetaData, SearchDelegator, Result, SearchableData, QueryTerms,
+} from '../../interfaces/search';
 
 
 const logger = loggerFactory('growi:service:search-delegator:elasticsearch');
 const logger = loggerFactory('growi:service:search-delegator:elasticsearch');
 
 
@@ -638,12 +640,9 @@ class ElasticsearchDelegator implements SearchDelegator<Data> {
     return query;
     return query;
   }
   }
 
 
-  appendCriteriaForQueryString(query, queryString) {
+  appendCriteriaForQueryString(query, parsedKeywords: QueryTerms) {
     query = this.initializeBoolQuery(query); // eslint-disable-line no-param-reassign
     query = this.initializeBoolQuery(query); // eslint-disable-line no-param-reassign
 
 
-    // parse
-    const parsedKeywords = this.parseQueryString(queryString);
-
     if (parsedKeywords.match.length > 0) {
     if (parsedKeywords.match.length > 0) {
       const q = {
       const q = {
         multi_match: {
         multi_match: {
@@ -835,11 +834,13 @@ class ElasticsearchDelegator implements SearchDelegator<Data> {
     };
     };
   }
   }
 
 
-  async search(queryString: string, user, userGroups, option): Promise<Result<Data> & MetaData> {
+  async search(data: SearchableData, user, userGroups, option): Promise<Result<Data> & MetaData> {
+    const { queryString, terms } = data;
+
     const from = option.offset || null;
     const from = option.offset || null;
     const size = option.limit || null;
     const size = option.limit || null;
     const query = this.createSearchQuerySortedByScore();
     const query = this.createSearchQuerySortedByScore();
-    this.appendCriteriaForQueryString(query, queryString);
+    this.appendCriteriaForQueryString(query, terms);
 
 
     await this.filterPagesByViewer(query, user, userGroups);
     await this.filterPagesByViewer(query, user, userGroups);
 
 

+ 3 - 3
packages/app/src/server/service/search.ts

@@ -3,7 +3,7 @@ import RE2 from 're2';
 
 
 import { NamedQueryModel, NamedQueryDocument } from '../models/named-query';
 import { NamedQueryModel, NamedQueryDocument } from '../models/named-query';
 import {
 import {
-  SearchDelegator, SearchQueryParser, SearchResolver, ParsedQuery, Result, MetaData,
+  SearchDelegator, SearchQueryParser, SearchResolver, ParsedQuery, Result, MetaData, SearchableData,
 } from '../interfaces/search';
 } from '../interfaces/search';
 
 
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
@@ -148,9 +148,9 @@ class SearchService implements SearchQueryParser, SearchResolver {
     return {} as ParsedQuery;
     return {} as ParsedQuery;
   }
   }
 
 
-  async resolve(parsedQuery: ParsedQuery): Promise<SearchDelegator> {
+  async resolve(parsedQuery: ParsedQuery): Promise<[SearchDelegator, SearchableData]> {
     // TODO: impl resolve
     // TODO: impl resolve
-    return {} as SearchDelegator;
+    return [{}, {}] as [SearchDelegator, SearchableData];
   }
   }
 
 
   async searchKeyword(keyword: string, user, userGroups, searchOpts): Promise<Result<any> & MetaData> {
   async searchKeyword(keyword: string, user, userGroups, searchOpts): Promise<Result<any> & MetaData> {