typesense
Version:
Javascript Library for Typesense
108 lines (92 loc) • 2.98 kB
text/typescript
import ApiCall from "./ApiCall";
import Configuration from "./Configuration";
import RequestWithCache from "./RequestWithCache";
import {
DocumentSchema,
SearchParams,
SearchParamsWithPreset,
SearchResponse,
SearchResponseRequestParams,
} from "./Documents";
import { normalizeArrayableParams } from "./Utils";
const RESOURCEPATH = "/multi_search";
export interface MultiSearchRequestSchema extends SearchParams {
collection?: string;
rerank_hybrid_matches?: boolean;
"x-typesense-api-key"?: string;
}
export interface MultiSearchRequestWithPresetSchema
extends SearchParamsWithPreset {
collection?: string;
"x-typesense-api-key"?: string;
}
export interface MultiSearchRequestsSchema<
U extends boolean | undefined = undefined,
> {
union?: U;
searches: (MultiSearchRequestSchema | MultiSearchRequestWithPresetSchema)[];
}
export interface UnionSearchResponse<T extends DocumentSchema>
extends Omit<SearchResponse<T>, "request_params"> {
union_request_params: SearchResponseRequestParams[];
}
export type MultiSearchResponse<
U extends boolean | undefined,
T extends DocumentSchema[],
> = U extends true
? UnionSearchResponse<T[number]>
: {
results: { [Index in keyof T]: SearchResponse<T[Index]> } & {
length: T["length"];
};
};
export default class MultiSearch {
private requestWithCache: RequestWithCache;
constructor(
private apiCall: ApiCall,
private configuration: Configuration,
private useTextContentType: boolean = false,
) {
this.requestWithCache = new RequestWithCache();
}
clearCache() {
this.requestWithCache.clearCache();
}
async perform<
T extends DocumentSchema[] = [],
const U extends boolean | undefined = undefined,
>(
searchRequests: MultiSearchRequestsSchema<U>,
commonParams: Partial<MultiSearchRequestSchema> = {},
{
cacheSearchResultsForSeconds = this.configuration
.cacheSearchResultsForSeconds,
}: { cacheSearchResultsForSeconds?: number } = {},
): Promise<MultiSearchResponse<U, T>> {
const additionalHeaders = {};
if (this.useTextContentType) {
additionalHeaders["content-type"] = "text/plain";
}
const additionalQueryParams = {};
if (this.configuration.useServerSideSearchCache === true) {
additionalQueryParams["use_cache"] = true;
}
const queryParams = { ...commonParams, ...additionalQueryParams };
const normalizedSearchRequests = {
...searchRequests,
searches: searchRequests.searches.map(normalizeArrayableParams),
};
const normalizedQueryParams = normalizeArrayableParams(queryParams);
return this.requestWithCache.perform(
this.apiCall,
this.apiCall.post,
[
RESOURCEPATH,
normalizedSearchRequests,
normalizedQueryParams,
additionalHeaders,
],
{ cacheResponseForSeconds: cacheSearchResultsForSeconds },
) as Promise<MultiSearchResponse<U, T>>;
}
}