diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index 538c272b9..c53f20551 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -201,6 +201,19 @@ const appendMatchFilters = ( filters: FieldFilter[] ): ESBuilder => { filters.forEach((filter) => { + if (filter.nested) { + // nested query + builder = builder.query('nested', { + path: filter.field.split('.')[0], // get the nested field name + query: { + match: { + [filter.field]: filter.value, + }, + }, + }) + return + } + builder = builder.query('match', { [filter.field]: filter.value, }) diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index 7021e91df..737572bec 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -82,6 +82,7 @@ export interface SortParams { } export interface FieldFilter { + nested?: boolean field: string value: string } @@ -260,10 +261,19 @@ const parseFieldFilter = ( return undefined } + let nested = false + // normalize the term to lower case + const value = str.toLowerCase() + + if (field === 'note') { + field = 'highlights.annotation' + nested = true + } + return { + nested, field, - // normalize the term to lower case - value: str.toLowerCase(), + value, } } @@ -343,6 +353,7 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { 'no', 'mode', 'site', + 'note', ], tokenize: true, }) @@ -414,6 +425,7 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { case 'author': case 'title': case 'description': + case 'note': case 'content': { const fieldFilter = parseFieldFilter(keyword.keyword, keyword.value) fieldFilter && result.matchFilters.push(fieldFilter)