32 lines
834 B
TypeScript
32 lines
834 B
TypeScript
import { QueryDslQueryContainer } from "@elastic/elasticsearch/lib/api/types";
|
|
|
|
export interface SearchInfo {
|
|
field: string;
|
|
value: string;
|
|
exact?: boolean;
|
|
}
|
|
|
|
export interface SearchOperator {
|
|
AND?: (SearchInfo | SearchOperator)[];
|
|
OR?: (SearchInfo | SearchOperator)[];
|
|
}
|
|
|
|
export interface Search extends SearchOperator {
|
|
recursive?: boolean;
|
|
path?: string[];
|
|
exact?: boolean;
|
|
}
|
|
|
|
export function mapCallback(exact: boolean) {
|
|
const type = ["match", "match_phrase"] as const;
|
|
return (v: SearchInfo | SearchOperator): QueryDslQueryContainer => {
|
|
return "field" in v && "value" in v
|
|
? { [type[exact || v.exact ? 1 : 0]]: { [v.field]: v.value } }
|
|
: {
|
|
bool: {
|
|
must: v.AND?.map(mapCallback(exact)),
|
|
should: v.OR?.map(mapCallback(exact)),
|
|
},
|
|
};
|
|
};
|
|
}
|