Skip to content

Commit

Permalink
Refactor: Update OpenSearch service to use new SearchRequest DTO; str…
Browse files Browse the repository at this point in the history
…eamline query execution and enhance response handling
  • Loading branch information
krharum committed Feb 18, 2025
1 parent 0ef7e4d commit 963f212
Show file tree
Hide file tree
Showing 15 changed files with 103 additions and 60 deletions.
24 changes: 24 additions & 0 deletions .github/workflows/app.dolly-search-service.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: dolly-search-service

on:
push:
paths:
- "plugins/**"
- "libs/data-transfer-search-objects/**"
- "libs/reactive-core/**"
- "libs/security-core/**"
- "libs/servlet-core/**"
- "libs/servlet-security/**"
- "apps/dolly-search-service/**"
- ".github/workflows/app.dolly-search-service.yml"

jobs:
workflow:
uses: ./.github/workflows/common.workflow.backend.yml
with:
working-directory: "apps/dolly-search-service"
deploy-tag: "#deploy-dolly-search-service"
permissions:
contents: read
id-token: write
secrets: inherit
2 changes: 1 addition & 1 deletion apps/dolly-search-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
FROM ghcr.io/navikt/baseimages/temurin:21
LABEL maintainer="Team Dolly"

ENV JAVA_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED -Dspring.profiles.active=prod"
ENV JAVA_OPTS="-Dspring.profiles.active=prod"

ADD /build/libs/app.jar /app/app.jar

Expand Down
2 changes: 1 addition & 1 deletion apps/dolly-search-service/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# testnav-person-search-service
# testnav-dolly-search-service
Service som forvalter søking på personer basert på innsendte kriterier

## Lokal kjøring
Expand Down
5 changes: 0 additions & 5 deletions apps/dolly-search-service/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,13 @@ sonarqube {
}

dependencies {
implementation "no.nav.testnav.libs:data-transfer-objects"
implementation "no.nav.testnav.libs:data-transfer-search-objects"
implementation "no.nav.testnav.libs:reactive-core"
implementation "no.nav.testnav.libs:security-core"
implementation "no.nav.testnav.libs:servlet-core"
implementation "no.nav.testnav.libs:servlet-security"

// implementation "org.springframework.boot:spring-boot-starter-data-elasticsearch"
implementation "org.opensearch.client:spring-data-opensearch:$versions.opensearch"
// implementation "org.springframework.boot:spring-boot-starter-data-jpa"

implementation "com.fasterxml.jackson.core:jackson-core:$versions.jackson"

Expand All @@ -28,7 +25,5 @@ dependencies {
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "org.springframework.boot:spring-boot-starter-cache"

implementation "ma.glasnost.orika:orika-core:$versions.orika"

implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:$versions.springdoc"
}
6 changes: 2 additions & 4 deletions apps/dolly-search-service/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,8 @@ spec:
accessPolicy:
inbound:
rules:
- application: dolly-frontend
- application: dolly-frontend-dev
- application: dolly-frontend-dev-unstable
- application: dolly-idporten
- application: dolly-backend
- application: dolly-backend-dev
- application: team-dolly-lokal-app
- application: testnav-oversikt-frontend
outbound:
Expand Down
11 changes: 0 additions & 11 deletions apps/dolly-search-service/docker-compose.yml

This file was deleted.

2 changes: 0 additions & 2 deletions apps/dolly-search-service/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,11 @@ rootProject.name = 'dolly-search-service'

includeBuild "../../plugins/java"

includeBuild '../../libs/data-transfer-objects'
includeBuild '../../libs/data-transfer-search-objects'
includeBuild '../../libs/reactive-core'
includeBuild '../../libs/security-core'
includeBuild '../../libs/servlet-core'
includeBuild '../../libs/servlet-security'
includeBuild '../../libs/testing'

develocity {
buildScan {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
import lombok.extern.slf4j.Slf4j;
import no.nav.testnav.dollysearchservice.config.Consumers;
import no.nav.testnav.dollysearchservice.consumer.command.OpenSearchCommand;
import no.nav.testnav.dollysearchservice.dto.SearchRequest;
import no.nav.testnav.dollysearchservice.dto.SearchResponse;
import no.nav.testnav.libs.securitycore.domain.ServerProperties;
import no.nav.testnav.libs.servletsecurity.exchange.TokenExchange;
import org.opensearch.action.search.SearchRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
Expand Down Expand Up @@ -39,10 +39,14 @@ public OpenSearchConsumer(
}

@SneakyThrows
public Flux<SearchResponse> search(SearchRequest searchRequest) {
public Flux<SearchResponse> search(SearchRequest request) {
return tokenExchange.exchange(serverProperties)
.flatMapMany(token ->
new OpenSearchCommand(webClient, searchRequest.indices()[0],
token.getTokenValue(), searchRequest.source().toString()).call());
new OpenSearchCommand(webClient, request.getQuery().indices()[0],
token.getTokenValue(), request.getQuery().source().toString()).call())
.map(response -> {
response.setRequest(request.getRequest());
return response;
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package no.nav.testnav.dollysearchservice.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SearchRequest {

private no.nav.testnav.libs.data.dollysearchservice.v1.SearchRequest request;
private org.opensearch.action.search.SearchRequest query;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import no.nav.testnav.libs.data.dollysearchservice.v1.SearchRequest;
import org.springframework.http.HttpStatus;

import java.util.List;
Expand All @@ -14,6 +15,8 @@
@AllArgsConstructor
public class SearchResponse {

private SearchRequest request;

private Integer took;
private Boolean timedOut;
private SearchHits hits;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,35 +1,27 @@
package no.nav.testnav.dollysearchservice.provider;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.RequiredArgsConstructor;
import no.nav.testnav.dollysearchservice.service.OpenSearchService;
import no.nav.testnav.libs.data.dollysearchservice.v1.SearchRequest;
import no.nav.testnav.libs.data.dollysearchservice.v1.SearchResponse;
import no.nav.testnav.dollysearchservice.service.OpenSearchService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/api/v1/elastic")
@RequestMapping("/api/v1/opensearch")
@RequiredArgsConstructor
public class OpensearchController {

private final OpenSearchService openSearchService;

@PostMapping("/identer")
@Operation(description = "Henter identer som matcher søk i request, både registre og persondetaljer")
public Mono<SearchResponse> getIdenterMed(@RequestBody SearchRequest request,
@Schema(description = "Sidenummer")
@RequestParam(required = false) Integer side,
@Schema(description = "Antall resultater per side")
@RequestParam(required = false) Integer antall,
@Schema(description = "Seed for paginering")
@RequestParam(required = false) Integer seed) {
public Mono<SearchResponse> getIdenterMed(@RequestBody SearchRequest request) {

return openSearchService.search(request, side, antall, seed);
return openSearchService.search(request);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import java.util.concurrent.TimeUnit;

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

Expand All @@ -27,25 +28,34 @@ public class OpenSearchService {
private final OpenSearchConsumer openSearchConsumer;
private final ObjectMapper objectMapper;

public Mono<SearchResponse> search(SearchRequest request, Integer side, Integer antall, Integer seed) {
public Mono<SearchResponse> search(SearchRequest request) {

var query = OpenSearchQueryBuilder.buildSearchQuery(request, seed);
return execQuery(query, side, antall);
var query = OpenSearchQueryBuilder.buildSearchQuery(request);
return execQuery(request, query);
}

private Mono<SearchResponse> execQuery(BoolQueryBuilder query, Integer side, Integer antall) {
private Mono<SearchResponse> execQuery(SearchRequest request, BoolQueryBuilder query) {

return Mono.from(openSearchConsumer.search(new org.opensearch.action.search.SearchRequest()
.indices("pdl-sok")
.source(new SearchSourceBuilder()
.from(nonNull(side) ? side : 0)
.query(query)
.size(nonNull(antall) ? antall : 10)
.timeout(new TimeValue(3, TimeUnit.SECONDS))))
.map(this::getIdenter));
if (isNull(request.getSide())) {
request.setSide(1);
}

return Mono.from(openSearchConsumer.search(
no.nav.testnav.dollysearchservice.dto.SearchRequest.builder()
.query(
new org.opensearch.action.search.SearchRequest()
.indices("pdl-sok")
.source(new SearchSourceBuilder()
.query(query)
.from(request.getSide())
.size(nonNull(request.getAntall()) ? request.getAntall() : 10)
.timeout(new TimeValue(3, TimeUnit.SECONDS))))
.request(request)
.build()))
.map(this::formatResponse);
}

private SearchResponse getIdenter(no.nav.testnav.dollysearchservice.dto.SearchResponse response) {
private SearchResponse formatResponse(no.nav.testnav.dollysearchservice.dto.SearchResponse response) {

if (isNotBlank(response.getError())) {
return SearchResponse.builder()
Expand All @@ -56,8 +66,9 @@ private SearchResponse getIdenter(no.nav.testnav.dollysearchservice.dto.SearchRe
return SearchResponse.builder()
.took(response.getTook().toString())
.totalHits(response.getHits().getTotal().getValue())
.score(response.getHits().getMaxScore())
.antall(response.getHits().getHits().size())
.side(response.getRequest().getSide())
.seed(response.getRequest().getSeed())
.personer(response.getHits().getHits().stream()
.map(no.nav.testnav.dollysearchservice.dto.SearchResponse.SearchHit::get_source)
.map(person -> objectMapper.convertValue(person, JsonNode.class))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import java.util.Optional;
import java.util.Random;

import static java.util.Objects.nonNull;
import static java.util.Objects.isNull;
import static no.nav.testnav.dollysearchservice.utils.OpenSearchIdenterQueryUtils.addIdenterIdentifier;
import static no.nav.testnav.dollysearchservice.utils.OpenSearchPersonQueryUtils.addAdresseBydelsnrQuery;
import static no.nav.testnav.dollysearchservice.utils.OpenSearchPersonQueryUtils.addAdresseKommunenrQuery;
Expand Down Expand Up @@ -51,10 +51,10 @@ public class OpenSearchQueryBuilder {

private static final Random SEED = new SecureRandom();

public static BoolQueryBuilder buildSearchQuery(SearchRequest request, Integer seed) {
public static BoolQueryBuilder buildSearchQuery(SearchRequest request) {

var queryBuilder = QueryBuilders.boolQuery()
.must(getRandomScoreQueryBuilder(seed))
.must(getRandomScoreQueryBuilder(request))
.must(addIdenterIdentifier(request));

setPersonQuery(queryBuilder, request);
Expand Down Expand Up @@ -103,9 +103,13 @@ private static void setPersonQuery(BoolQueryBuilder queryBuilder, SearchRequest
});
}

private static FunctionScoreQueryBuilder getRandomScoreQueryBuilder(Integer seed) {
private static FunctionScoreQueryBuilder getRandomScoreQueryBuilder(SearchRequest request) {

if (isNull(request.getSeed())){
request.setSeed(SEED.nextInt());
}

return QueryBuilders.functionScoreQuery(new RandomScoreFunctionBuilder()
.seed(nonNull(seed) ? seed : SEED.nextInt()));
.seed(request.getSeed()));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.nav.testnav.libs.data.dollysearchservice.v1;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
Expand All @@ -16,8 +17,17 @@
@AllArgsConstructor
public class SearchRequest {

@Schema(description = "Sidenummer")
private Integer side;
@Schema(description = "Antall resultater per side")
private Integer antall;
@Schema(description = "Seed for paginering")
private Integer seed;

@Schema(description = "Persondetaljer")
private PersonRequest personRequest;

@Schema(description = "Identer fra registre")
private Set<String> identer;

public Set<String> getIdenter() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
public class SearchResponse {

private Long totalHits;
private Float score;
private String took;
private Integer side;
private Integer antall;
Expand Down

0 comments on commit 963f212

Please sign in to comment.