Skip to content

Commit 3a8608b

Browse files
authored
Add federated search parameters (#1689)
* Remove cross-fetch dependency * Add types for federation feature * Add test, minor changes to types * Revert "Remove cross-fetch dependency" This reverts commit 899d2a7. * Revert generic name back to T for consistency * Revert rest of the generics to T * Remove focus from test * Revert changes to test-utils getClient * Add back accidentally removed type from test utils
1 parent 30e833f commit 3a8608b

File tree

3 files changed

+79
-12
lines changed

3 files changed

+79
-12
lines changed

src/clients/client.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
* Copyright: 2019, MeiliSearch
66
*/
77

8-
'use strict';
9-
108
import { Index } from '../indexes';
119
import {
1210
KeyCreation,
@@ -34,6 +32,8 @@ import {
3432
DeleteTasksQuery,
3533
MultiSearchParams,
3634
MultiSearchResponse,
35+
SearchResponse,
36+
FederatedMultiSearchParams,
3737
} from '../types';
3838
import { HttpRequests } from '../http-requests';
3939
import { TaskClient, Task } from '../task';
@@ -216,10 +216,18 @@ class Client {
216216
* @param config - Additional request configuration options
217217
* @returns Promise containing the search responses
218218
*/
219-
async multiSearch<T extends Record<string, any> = Record<string, any>>(
220-
queries?: MultiSearchParams,
219+
multiSearch<T extends Record<string, unknown> = Record<string, any>>(
220+
queries: MultiSearchParams,
221+
config?: Partial<Request>,
222+
): Promise<MultiSearchResponse<T>>;
223+
multiSearch<T extends Record<string, unknown> = Record<string, any>>(
224+
queries: FederatedMultiSearchParams,
225+
config?: Partial<Request>,
226+
): Promise<SearchResponse<T>>;
227+
async multiSearch<T extends Record<string, unknown> = Record<string, any>>(
228+
queries: MultiSearchParams | FederatedMultiSearchParams,
221229
config?: Partial<Request>,
222-
): Promise<MultiSearchResponse<T>> {
230+
): Promise<MultiSearchResponse<T> | SearchResponse<T>> {
223231
const url = `multi-search`;
224232

225233
return await this.httpRequest.post(url, queries, undefined, config);

src/types/types.ts

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,21 @@ export type SearchRequestGET = Pagination &
159159
locales?: Locale[];
160160
};
161161

162+
export type FederationOptions = { weight: number };
163+
export type MultiSearchFederation = { limit?: number; offset?: number };
164+
162165
export type MultiSearchQuery = SearchParams & { indexUid: string };
166+
export type MultiSearchQueryWithFederation = MultiSearchQuery & {
167+
federationOptions?: FederationOptions;
168+
};
163169

164170
export type MultiSearchParams = {
165171
queries: MultiSearchQuery[];
166172
};
173+
export type FederatedMultiSearchParams = {
174+
federation: MultiSearchFederation;
175+
queries: MultiSearchQueryWithFederation[];
176+
};
167177

168178
export type CategoriesDistribution = {
169179
[category: string]: number;
@@ -175,13 +185,6 @@ export type MatchesPosition<T> = Partial<
175185
Record<keyof T, Array<{ start: number; length: number }>>
176186
>;
177187

178-
export type Hit<T = Record<string, any>> = T & {
179-
_formatted?: Partial<T>;
180-
_matchesPosition?: MatchesPosition<T>;
181-
_rankingScore?: number;
182-
_rankingScoreDetails?: RankingScoreDetails;
183-
};
184-
185188
export type RankingScoreDetails = {
186189
words?: {
187190
order: number;
@@ -213,6 +216,20 @@ export type RankingScoreDetails = {
213216
[key: string]: Record<string, any> | undefined;
214217
};
215218

219+
export type FederationDetails = {
220+
indexUid: string;
221+
queriesPosition: number;
222+
weightedRankingScore: number;
223+
};
224+
225+
export type Hit<T = Record<string, any>> = T & {
226+
_formatted?: Partial<T>;
227+
_matchesPosition?: MatchesPosition<T>;
228+
_rankingScore?: number;
229+
_rankingScoreDetails?: RankingScoreDetails;
230+
_federation?: FederationDetails;
231+
};
232+
216233
export type Hits<T = Record<string, any>> = Array<Hit<T>>;
217234

218235
export type FacetStat = { min: number; max: number };

tests/search.test.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,48 @@ describe.each([
143143
expect(response.results[0].hits[0].title).toEqual('Le Petit Prince');
144144
});
145145

146+
test(`${permission} key: Multi index search with federation`, async () => {
147+
const client = await getClient(permission);
148+
149+
const response1 = await client.multiSearch<
150+
Books | { id: number; asd: string }
151+
>({
152+
federation: {},
153+
queries: [
154+
{ indexUid: index.uid, q: '456', attributesToSearchOn: ['id'] },
155+
{
156+
indexUid: index.uid,
157+
q: '1344',
158+
federationOptions: { weight: 0.9 },
159+
attributesToSearchOn: ['id'],
160+
},
161+
],
162+
});
163+
164+
expect(response1).toHaveProperty('hits');
165+
expect(Array.isArray(response1.hits)).toBe(true);
166+
expect(response1.hits.length).toEqual(2);
167+
expect(response1.hits[0].id).toEqual(456);
168+
169+
const response2 = await client.multiSearch({
170+
federation: {},
171+
queries: [
172+
{
173+
indexUid: index.uid,
174+
q: '456',
175+
federationOptions: { weight: 0.9 },
176+
attributesToSearchOn: ['id'],
177+
},
178+
{ indexUid: index.uid, q: '1344', attributesToSearchOn: ['id'] },
179+
],
180+
});
181+
182+
expect(response2).toHaveProperty('hits');
183+
expect(Array.isArray(response2.hits)).toBe(true);
184+
expect(response2.hits.length).toEqual(2);
185+
expect(response2.hits[0].id).toEqual(1344);
186+
});
187+
146188
test(`${permission} key: Basic search`, async () => {
147189
const client = await getClient(permission);
148190
const response = await client.index(index.uid).search('prince', {});

0 commit comments

Comments
 (0)