feat: exact match search
This commit is contained in:
parent
e65fb9f5d9
commit
6e9145e3cc
4 changed files with 26 additions and 4 deletions
|
|
@ -15,12 +15,18 @@ export class SearchController extends Controller {
|
|||
@Security("bearerAuth")
|
||||
@SuccessResponse(HttpStatusCode.OK, "สำเร็จ")
|
||||
public async searchFile(@Body() search: Search): Promise<StorageFile[]> {
|
||||
const type = ["match", "match_phrase"] as const;
|
||||
|
||||
const result = await esClient.search<StorageFile & { attachment: Record<string, string> }>({
|
||||
index: DEFAULT_INDEX,
|
||||
query: {
|
||||
bool: {
|
||||
must: search.AND?.map((v) => ({ match: { [v.field]: v.value } })),
|
||||
should: search.OR?.map((v) => ({ match: { [v.field]: v.value } })),
|
||||
must: search.AND?.map((v) => ({
|
||||
[type[search.exact || v.exact ? 1 : 0]]: { [v.field]: v.value },
|
||||
})),
|
||||
should: search.OR?.map((v) => ({
|
||||
[type[search.exact || v.exact ? 1 : 0]]: { [v.field]: v.value },
|
||||
})),
|
||||
},
|
||||
},
|
||||
size: 10000,
|
||||
|
|
|
|||
|
|
@ -2,9 +2,12 @@ export interface Search {
|
|||
AND?: {
|
||||
field: string;
|
||||
value: string;
|
||||
exact?: boolean;
|
||||
}[];
|
||||
OR?: {
|
||||
field: string;
|
||||
value: string;
|
||||
exact?: boolean;
|
||||
}[];
|
||||
exact: boolean;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,8 +61,9 @@ const models: TsoaRoute.Models = {
|
|||
"Search": {
|
||||
"dataType": "refObject",
|
||||
"properties": {
|
||||
"AND": {"dataType":"array","array":{"dataType":"nestedObjectLiteral","nestedProperties":{"value":{"dataType":"string","required":true},"field":{"dataType":"string","required":true}}}},
|
||||
"OR": {"dataType":"array","array":{"dataType":"nestedObjectLiteral","nestedProperties":{"value":{"dataType":"string","required":true},"field":{"dataType":"string","required":true}}}},
|
||||
"AND": {"dataType":"array","array":{"dataType":"nestedObjectLiteral","nestedProperties":{"exact":{"dataType":"boolean"},"value":{"dataType":"string","required":true},"field":{"dataType":"string","required":true}}}},
|
||||
"OR": {"dataType":"array","array":{"dataType":"nestedObjectLiteral","nestedProperties":{"exact":{"dataType":"boolean"},"value":{"dataType":"string","required":true},"field":{"dataType":"string","required":true}}}},
|
||||
"exact": {"dataType":"boolean","required":true},
|
||||
},
|
||||
"additionalProperties": false,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -138,6 +138,9 @@
|
|||
"AND": {
|
||||
"items": {
|
||||
"properties": {
|
||||
"exact": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"value": {
|
||||
"type": "string"
|
||||
},
|
||||
|
|
@ -156,6 +159,9 @@
|
|||
"OR": {
|
||||
"items": {
|
||||
"properties": {
|
||||
"exact": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"value": {
|
||||
"type": "string"
|
||||
},
|
||||
|
|
@ -170,8 +176,14 @@
|
|||
"type": "object"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"exact": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"exact"
|
||||
],
|
||||
"type": "object",
|
||||
"additionalProperties": false
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue