diff --git a/Services/server/src/controllers/searchController.ts b/Services/server/src/controllers/searchController.ts index 0a6c669..48c2f1e 100644 --- a/Services/server/src/controllers/searchController.ts +++ b/Services/server/src/controllers/searchController.ts @@ -15,12 +15,18 @@ export class SearchController extends Controller { @Security("bearerAuth") @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") public async searchFile(@Body() search: Search): Promise { + const type = ["match", "match_phrase"] as const; + const result = await esClient.search }>({ 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, diff --git a/Services/server/src/interfaces/search.ts b/Services/server/src/interfaces/search.ts index 74b5286..1206d69 100644 --- a/Services/server/src/interfaces/search.ts +++ b/Services/server/src/interfaces/search.ts @@ -2,9 +2,12 @@ export interface Search { AND?: { field: string; value: string; + exact?: boolean; }[]; OR?: { field: string; value: string; + exact?: boolean; }[]; + exact: boolean; } diff --git a/Services/server/src/routes.ts b/Services/server/src/routes.ts index 31f7bc9..ad9768e 100644 --- a/Services/server/src/routes.ts +++ b/Services/server/src/routes.ts @@ -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, }, diff --git a/Services/server/src/swagger.json b/Services/server/src/swagger.json index 9952e03..873ab0c 100644 --- a/Services/server/src/swagger.json +++ b/Services/server/src/swagger.json @@ -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 },