diff --git a/frontends/search/src/components/ResultsPage.tsx b/frontends/search/src/components/ResultsPage.tsx index 73d9bb147e..370cd69e44 100644 --- a/frontends/search/src/components/ResultsPage.tsx +++ b/frontends/search/src/components/ResultsPage.tsx @@ -313,8 +313,32 @@ const ResultsPage = (props: ResultsPageProps) => { group_size: props.search.debounced.group_size ?? 3, use_quote_negated_terms: props.search.debounced.useQuoteNegatedTerms, remove_stop_words: props.search.debounced.removeStopWords, + scoring_options: {}, }; + if ( + props.search.debounced.scoringOptions?.fulltext_boost?.boost_factor && + props.search.debounced.scoringOptions?.fulltext_boost?.phrase + ) { + requestBody.scoring_options.fulltext_boost = { + boost_factor: + props.search.debounced.scoringOptions.fulltext_boost.boost_factor, + phrase: props.search.debounced.scoringOptions.fulltext_boost.phrase, + }; + } + if ( + props.search.debounced.scoringOptions?.semantic_boost + ?.distance_factor && + props.search.debounced.scoringOptions?.semantic_boost?.phrase + ) { + requestBody.scoring_options.semantic_boost = { + distance_factor: + props.search.debounced.scoringOptions.semantic_boost + .distance_factor, + phrase: props.search.debounced.scoringOptions.semantic_boost.phrase, + }; + } + let searchRoute = ""; let groupUnique = false; if ( diff --git a/frontends/search/src/components/SearchForm.tsx b/frontends/search/src/components/SearchForm.tsx index 78c14b6fb4..055b20c134 100644 --- a/frontends/search/src/components/SearchForm.tsx +++ b/frontends/search/src/components/SearchForm.tsx @@ -1485,6 +1485,113 @@ const SearchForm = (props: { /> +
Scoring Options
+
+ + { + setTempSearchValues((prev) => { + return { + ...prev, + scoringOptions: { + ...prev.scoringOptions, + fulltext_boost: { + ...prev.scoringOptions?.fulltext_boost, + phrase: e.currentTarget.value, + }, + }, + }; + }); + }} + /> +
+
+ + { + setTempSearchValues((prev) => { + return { + ...prev, + scoringOptions: { + ...prev.scoringOptions, + fulltext_boost: { + ...prev.scoringOptions?.fulltext_boost, + boost_factor: parseFloat( + e.currentTarget.value, + ), + }, + }, + }; + }); + }} + /> +
+
+ + { + setTempSearchValues((prev) => { + return { + ...prev, + scoringOptions: { + ...prev.scoringOptions, + semantic_boost: { + ...prev.scoringOptions?.semantic_boost, + phrase: e.currentTarget.value, + }, + }, + }; + }); + }} + /> +
+
+ + { + setTempSearchValues((prev) => { + return { + ...prev, + scoringOptions: { + ...prev.scoringOptions, + semantic_boost: { + ...prev.scoringOptions?.semantic_boost, + distance_factor: parseFloat( + e.currentTarget.value, + ), + }, + }, + }; + }); + }} + /> +
diff --git a/frontends/search/src/hooks/useSearch.ts b/frontends/search/src/hooks/useSearch.ts index 70eabdf6c4..5969c362dd 100644 --- a/frontends/search/src/hooks/useSearch.ts +++ b/frontends/search/src/hooks/useSearch.ts @@ -17,6 +17,21 @@ export interface MultiQuery { weight: number; } +export interface FulltextBoost { + phrase?: string; + boost_factor?: number; +} + +export interface SemanticBoost { + phrase?: string; + distance_factor?: number; +} + +export interface ScoringOptions { + fulltext_boost?: FulltextBoost; + semantic_boost?: SemanticBoost; +} + export function isSortByField( sortBy: SortByField | SortBySearchType, ): sortBy is SortByField { @@ -66,6 +81,7 @@ export interface SearchOptions { removeStopWords: boolean; filters: Filters | null; multiQueries: MultiQuery[]; + scoringOptions?: ScoringOptions; } const initalState: SearchOptions = { @@ -104,6 +120,7 @@ const initalState: SearchOptions = { jsonb_prefilter: true, } as Filters, multiQueries: [], + scoringOptions: undefined, }; const fromStateToParams = (state: SearchOptions): Params => { @@ -136,6 +153,7 @@ const fromStateToParams = (state: SearchOptions): Params => { removeStopWords: state.removeStopWords.toString(), filters: JSON.stringify(state.filters), multiQueries: JSON.stringify(state.multiQueries), + scoringOptions: JSON.stringify(state.scoringOptions), }; }; @@ -182,6 +200,9 @@ const fromParamsToState = ( removeStopWords: (params.removeStopWords ?? "false") === "true", filters: JSON.parse(params.filters ?? "null") as Filters | null, multiQueries: JSON.parse(params.multiQueries ?? "[]") as MultiQuery[], + scoringOptions: JSON.parse( + params.scoringOptions ?? "null", + ) as ScoringOptions, }; };