diff --git a/internal/catalog/search_indexer.go b/internal/catalog/search_indexer.go index de67f19c..f98859b5 100644 --- a/internal/catalog/search_indexer.go +++ b/internal/catalog/search_indexer.go @@ -258,7 +258,7 @@ func (i *CatalogSearchIndexer) Rebuild(ctx context.Context, progress SearchIndex if err := client.WaitTask(ctx, taskID); err != nil { return stats, err } - taskID, err = client.UpdateSettings(ctx, buildIndexUID, catalogSearchMeilisearchSettings(settings.Embedder)) + taskID, err = client.UpdateSettings(ctx, buildIndexUID, catalogSearchMeilisearchSettings(settings.Embedder, settings.SemanticEnabled)) if err != nil { return stats, err } @@ -438,12 +438,8 @@ func (i *CatalogSearchIndexer) CheckConnection(ctx context.Context, settings Cat return client.Health(ctx) } -func catalogSearchMeilisearchSettings(embedder string) map[string]any { - embedder, err := NormalizeCatalogSearchEmbedderName(embedder) - if err != nil { - embedder = DefaultMeilisearchEmbedder - } - return map[string]any{ +func catalogSearchMeilisearchSettings(embedder string, semanticEnabled bool) map[string]any { + settings := map[string]any{ "displayedAttributes": []string{"content_id", "type"}, "filterableAttributes": []string{"type"}, "searchableAttributes": []string{ @@ -462,8 +458,15 @@ func catalogSearchMeilisearchSettings(embedder string) map[string]any { "pagination": map[string]any{ "maxTotalHits": meilisearchDefaultCandidateScanCap, }, - "embedders": catalogSearchMeilisearchEmbedderSettings(embedder), } + if semanticEnabled { + embedder, err := NormalizeCatalogSearchEmbedderName(embedder) + if err != nil { + embedder = DefaultMeilisearchEmbedder + } + settings["embedders"] = catalogSearchMeilisearchEmbedderSettings(embedder) + } + return settings } func coalesceSearchIndexEvents(events []SearchIndexEvent) (upsertIDs []string, deleteIDs []string) { diff --git a/internal/catalog/search_provider_test.go b/internal/catalog/search_provider_test.go index cae30730..88cfcdd7 100644 --- a/internal/catalog/search_provider_test.go +++ b/internal/catalog/search_provider_test.go @@ -127,6 +127,29 @@ func TestCatalogSearchDocumentVectorsUseEmbedderAndOptOutMissing(t *testing.T) { } } +func TestCatalogSearchMeilisearchSettingsOmitEmbeddersWhenSemanticDisabled(t *testing.T) { + settings := catalogSearchMeilisearchSettings("silo_recommendations", false) + + if _, ok := settings["embedders"]; ok { + t.Fatalf("semantic-disabled settings should not include embedders: %#v", settings["embedders"]) + } + if _, ok := settings["searchableAttributes"]; !ok { + t.Fatal("semantic-disabled settings should still configure keyword searchable attributes") + } +} + +func TestCatalogSearchMeilisearchSettingsIncludeEmbeddersWhenSemanticEnabled(t *testing.T) { + settings := catalogSearchMeilisearchSettings("custom_embedder", true) + + embedders, ok := settings["embedders"].(map[string]any) + if !ok { + t.Fatalf("embedders = %#v, want map[string]any", settings["embedders"]) + } + if _, ok := embedders["custom_embedder"]; !ok { + t.Fatalf("embedders = %#v, want custom_embedder", embedders) + } +} + func TestCatalogSearchDocumentPayloadBatchesSplitVectorDocs(t *testing.T) { vector := make([]float32, 128) docs := []catalogSearchDocument{ diff --git a/migrations/sql/20260626160056_meilisearch_semantic_ratio_default_050.sql b/migrations/sql/20260626160056_meilisearch_semantic_ratio_default_050.sql new file mode 100644 index 00000000..79a0f4a4 --- /dev/null +++ b/migrations/sql/20260626160056_meilisearch_semantic_ratio_default_050.sql @@ -0,0 +1,15 @@ +-- +goose Up +UPDATE server_settings +SET value = '0.50' +WHERE key = 'catalog.search.meilisearch.semantic_ratio' + AND value = '0.30'; + +INSERT INTO server_settings (key, value) +VALUES ('catalog.search.meilisearch.semantic_ratio', '0.50') +ON CONFLICT (key) DO NOTHING; + +-- +goose Down +UPDATE server_settings +SET value = '0.30' +WHERE key = 'catalog.search.meilisearch.semantic_ratio' + AND value = '0.50';