関連ページ

/資料/外部仕様/検索v5

検索v5

概要

全文検索に限らず、より汎用的な検索を行えるようにする

  • クエリパラメータのフォーマット
    • q=検索キーワード
    • nq=名前付きクエリ名

!! 実装がやや変更されています !!

実装者へ

search delegator を拡張する時は、汎用的なものは FormattedSearchResult.data.pageData に、delegator 特有のものは FormattedSearchResult.data.pageMeta に入れるように実装してください。IPageHasId を満たさないが汎用的なものは新たに pageHoge などを追加して、pageMeta には入れないようにするか、IPageHasId & Hoge にすることで pageData を拡張するのがいいと思います

type FormattedSearchResult = { data: { pageData: IPageHasId // 汎用的で表示に必須なもの pageMeta: { // ハイライトなど、表示に必須ではないオプション bookmarkCount?: number elasticsearchResult?: { snippet: string highlightedPath: string } } }[] totalCount: number meta: { total: number took?: number count?: number } }

検索処理の大まかなフロー

  1. クエリ文字列を Parse する
  2. Resolver が Parse の結果を用いて Delegator を決定する
  3. Delegator が検索を実行する
    • クライアントに返す値のフォーマットは SearchService.formatSearchResult が行う

全体設計

実装: https://github.com/weseek/growi/blob/dev/5.0.x/packages/app/src/server/service/search.ts external_link

Parser

クエリ文字列をパースする

  • インターフェイス
    interface SearchQueryParser { parseSearchQuery(queryString: string): Promise<ParsedQuery> }
  • 引数
    • queryString
      • 検索バーに入力されたもの
  • 返り値
    • ParsedQuery
      type ParsedQuery = { queryString: string, terms?: QueryTerms, delegatorName?: string }

Resolver

Delegator を解決する

  • インターフェイス
    interface SearchResolver{ resolve(parsedQuery: ParsedQuery): Promise<[SearchDelegator, SearchableData | null]> } type SearchableData = { queryString: string terms: QueryTerms }
  • 引数
    • parsedQuery
      • parse の結果
  • 返り値
    • [SearchDelegator, SearchableData | null]

Delegator

検索を実行する

  • インターフェイス

    interface SearchDelegator<T = unknown> { name: SearchDelegatorName search(data: SearchableData | null, user, userGroups, option): Promise<Result<T> & MetaData> } enum SearchDelegatorName { DEFAULT = 'FullTextSearch', PRIVATE_LEGACY_PAGES = 'PrivateLegacyPages', } type Result<T> = { data: T[] } type MetaData = { meta: { [key:string]: any, total: number, // 必須 } }
  • 引数

    • data: SearchableData | null
    • user, userGroups, option
      • 権限やページネーションに必要
  • 返り値

    • Result<T> & MetaData

NamedQuery モデル

interface INamedQuery { name: string aliasOf?: string delegatorName?: SearchDelegatorName creator?: IUser }

コメント

質問は taichi-m まで

検索用ワード

待避所 private legacy pages elastic search フィルタ 検索