関連ページ
検索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 } }
検索処理の大まかなフロー
- クエリ文字列を Parse する
- Resolver が Parse の結果を用いて Delegator を決定する
- Delegator が検索を実行する
- クライアントに返す値のフォーマットは
SearchService.formatSearchResult
が行う
- クライアントに返す値のフォーマットは
全体設計
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 フィルタ 検索