From 4fa51985012aec3e973c3826b4cb4f469d5e3649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Thu, 19 Mar 2026 15:52:58 +0100 Subject: [PATCH] Improve highlight support in osu Co-authored-by: Florian Schade --- services/search/pkg/opensearch/backend.go | 10 +++-- .../pkg/opensearch/internal/osu/request.go | 37 +++++++++++++++++-- .../opensearch/internal/osu/request_test.go | 20 +++++++--- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/services/search/pkg/opensearch/backend.go b/services/search/pkg/opensearch/backend.go index 18d0995c2a..69a6b7df36 100644 --- a/services/search/pkg/opensearch/backend.go +++ b/services/search/pkg/opensearch/backend.go @@ -112,11 +112,13 @@ func (b *Backend) Search(ctx context.Context, sir *searchService.SearchIndexRequ boolQuery, osu.SearchBodyParams{ Highlight: &osu.BodyParamHighlight{ - PreTags: []string{""}, - PostTags: []string{""}, - Fields: map[string]osu.BodyParamHighlight{ + HighlightOptions: osu.HighlightOptions{ + PreTags: []string{""}, + PostTags: []string{""}, + }, + Fields: map[string]osu.HighlightOptions{ "Content": { - Type: "fvh", + Type: osu.HighlightTypeFvh, }, }, }, diff --git a/services/search/pkg/opensearch/internal/osu/request.go b/services/search/pkg/opensearch/internal/osu/request.go index 04e4c3396d..927da7ac54 100644 --- a/services/search/pkg/opensearch/internal/osu/request.go +++ b/services/search/pkg/opensearch/internal/osu/request.go @@ -41,10 +41,39 @@ func (q QueryReqBody[O]) MarshalJSON() ([]byte, error) { //----------------------------------------------------------------------------// type BodyParamHighlight struct { - PreTags []string `json:"pre_tags,omitempty"` - PostTags []string `json:"post_tags,omitempty"` - Type string `json:"type,omitempty"` - Fields map[string]BodyParamHighlight `json:"fields,omitempty"` + HighlightOptions + Fields map[string]HighlightOptions `json:"fields,omitempty"` +} + +type HighlightType string + +const ( + HighlightTypeUnified HighlightType = "unified" + HighlightTypeFvh HighlightType = "fvh" + HighlightTypePlain HighlightType = "plain" + HighlightTypeSemantic HighlightType = "semantic" +) + +type HighlightOptions struct { + Type HighlightType `json:"type,omitempty"` + FragmentSize int `json:"fragment_size,omitempty"` + NumberOfFragments int `json:"number_of_fragments,omitempty"` + FragmentOffset int `json:"fragment_offset,omitempty"` + BoundaryChars string `json:"boundary_chars,omitempty"` + BoundaryMaxScan int `json:"boundary_max_scan,omitempty"` + BoundaryScanner string `json:"boundary_scanner,omitempty"` + BoundaryScannerLocale string `json:"boundary_scanner_locale,omitempty"` + Encoder string `json:"encoder,omitempty"` + ForceSource bool `json:"force_source,omitempty"` + Fragmenter string `json:"fragmenter,omitempty"` + HighlightQuery Builder `json:"highlight_query,omitempty"` + Order string `json:"order,omitempty"` + NoMatchSize int `json:"no_match_size,omitempty"` + RequireFieldMatch bool `json:"require_field_match,omitempty"` + MatchedFields []string `json:"matched_fields,omitempty"` + PhraseLimit int `json:"phrase_limit,omitempty"` + PreTags []string `json:"pre_tags,omitempty"` + PostTags []string `json:"post_tags,omitempty"` } type BodyParamScript struct { diff --git a/services/search/pkg/opensearch/internal/osu/request_test.go b/services/search/pkg/opensearch/internal/osu/request_test.go index 6a48cd398e..535f05bd82 100644 --- a/services/search/pkg/opensearch/internal/osu/request_test.go +++ b/services/search/pkg/opensearch/internal/osu/request_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/require" "github.com/opencloud-eu/opencloud/services/search/pkg/opensearch/internal/osu" - "github.com/opencloud-eu/opencloud/services/search/pkg/opensearch/internal/test" + opensearchtest "github.com/opencloud-eu/opencloud/services/search/pkg/opensearch/internal/test" ) func TestRequestBody(t *testing.T) { @@ -46,10 +46,15 @@ func TestBuildSearchReq(t *testing.T) { osu.NewTermQuery[string]("content").Value("content"), osu.SearchBodyParams{ Highlight: &osu.BodyParamHighlight{ - PreTags: []string{""}, - PostTags: []string{""}, - Fields: map[string]osu.BodyParamHighlight{ - "content": {}, + HighlightOptions: osu.HighlightOptions{ + PreTags: []string{""}, + PostTags: []string{""}, + }, + Fields: map[string]osu.HighlightOptions{ + "content": { + PreTags: []string{""}, + PostTags: []string{""}, + }, }, }, }, @@ -69,7 +74,10 @@ func TestBuildSearchReq(t *testing.T) { "pre_tags": []string{""}, "post_tags": []string{""}, "fields": map[string]any{ - "content": map[string]any{}, + "content": map[string]any{ + "pre_tags": []string{""}, + "post_tags": []string{""}, + }, }, }, },