Merge pull request 'Changed 'match' query to 'multi-match'. Allows to search for both 'content' and 'title' of the paper' (#17) from fix/search into develop
Reviewed-on: http://85.143.176.51:3000/free-land/backend/pulls/17
This commit is contained in:
commit
762af0c3dd
68
src/core/domain/dtos/elastic/es-multimatch.dto.ts
Normal file
68
src/core/domain/dtos/elastic/es-multimatch.dto.ts
Normal file
@ -0,0 +1,68 @@
|
||||
import { ApiExtraModels, ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
|
||||
import { IsArray, IsDefined, IsInt, IsObject, IsOptional } from "class-validator";
|
||||
import { EsPit } from "../../interfaces/elastic/es-pit.interface";
|
||||
import { EsQuery } from "../../interfaces/elastic/es-query.interface"
|
||||
|
||||
/**
|
||||
* List of allowed properties in this DTO
|
||||
*/
|
||||
const allowedProperties = ['query'];
|
||||
|
||||
/**
|
||||
* Elasticsearch multi-match query DTO
|
||||
*/
|
||||
@ApiExtraModels()
|
||||
export class EsMultimatchQueryDto {
|
||||
/**
|
||||
* Offset from the start of the list of hits
|
||||
*/
|
||||
@IsOptional()
|
||||
@IsInt()
|
||||
@ApiPropertyOptional({
|
||||
description: 'Offset from the start of the list of hits',
|
||||
example: 5,
|
||||
})
|
||||
public from?: number;
|
||||
|
||||
/**
|
||||
* Maximum number of elements returned by Elasticsearch
|
||||
*/
|
||||
@IsOptional()
|
||||
@IsInt()
|
||||
@ApiPropertyOptional({
|
||||
description: 'Maximum number of elements returned by Elasticsearch',
|
||||
example: 30
|
||||
})
|
||||
public size?: number;
|
||||
|
||||
/**
|
||||
* The search query object passed to Elasticsearch
|
||||
*/
|
||||
@IsDefined()
|
||||
@IsObject()
|
||||
@ApiProperty({
|
||||
description: 'Search query object passed to Elasticsearch',
|
||||
example: {
|
||||
multi_match: {
|
||||
query: 'Maths',
|
||||
fields: [
|
||||
'title',
|
||||
'content'
|
||||
]
|
||||
}
|
||||
},
|
||||
})
|
||||
private readonly query: Object;
|
||||
|
||||
/**
|
||||
* Constructs a multi-match
|
||||
*/
|
||||
constructor(query: string = '', fields: Array<string> = ['content']) {
|
||||
this.query = {
|
||||
multi_match: {
|
||||
query: query,
|
||||
fields: fields
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
import { HttpService } from "@nestjs/axios";
|
||||
import { GatewayTimeoutException, ImATeapotException, Injectable, NotFoundException } from "@nestjs/common";
|
||||
import { map, take } from "rxjs";
|
||||
import { EsMultimatchQueryDto } from "src/core/domain/dtos/elastic/es-multimatch.dto";
|
||||
import { EsResponseDto, SearchQueryDto} from "../../domain/dtos";
|
||||
import { EsQueryDto } from "../../domain/dtos/elastic/es-query.dto";
|
||||
|
||||
@ -69,13 +70,9 @@ export class SearchService {
|
||||
*/
|
||||
async findByContext(query: SearchQueryDto): Promise<EsResponseDto> {
|
||||
// Contruct a body for querying Elasticsearch
|
||||
const es_query: EsQueryDto = new EsQueryDto();
|
||||
es_query.query = {
|
||||
query_string: {
|
||||
query: query.query,
|
||||
default_field: 'content',
|
||||
}
|
||||
};
|
||||
const es_query: EsMultimatchQueryDto = new EsMultimatchQueryDto(query.query, [
|
||||
'title', 'content'
|
||||
]);
|
||||
es_query.from = query.offset;
|
||||
es_query.size = query.limit;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user