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,
};
};