diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 34810ddb..22d5e8d8 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -470,12 +470,17 @@ search_parameter_guide_show_ranking_score_details_1: |- }) search_parameter_guide_matching_strategy_1: |- resp, err := client.Index("movies").Search("big fat liar", &meilisearch.SearchRequest{ - MatchingStrategy: "last", + MatchingStrategy: Last, }) search_parameter_guide_matching_strategy_2: |- resp, err := client.Index("movies").Search("big fat liar", &meilisearch.SearchRequest{ - MatchingStrategy: "all", + MatchingStrategy: All, }) +search_parameter_guide_matching_strategy_3: |- + client.Index("movies").Search("white shirt", &meilisearch.SearchRequest{ + MatchingStrategy: Frequency, + }) + search_parameter_guide_hitsperpage_1: |- client.Index("movies").Search("", &meilisearch.SearchRequest{ HitsPerPage: 15, @@ -924,3 +929,9 @@ update_non_separator_tokens_1: |- }) reset_non_separator_tokens_1: |- client.Index("articles").ResetNonSeparatorTokens() +get_proximity_precision_settings_1: |- + client.Index("books").GetProximityPrecision() +update_proximity_precision_settings_1: |- + client.Index("books").UpdateProximityPrecision(ByAttribute) +reset_proximity_precision_settings_1: |- + client.Index("books").ResetProximityPrecision() diff --git a/index.go b/index.go index c40f6273..357ac640 100644 --- a/index.go +++ b/index.go @@ -556,6 +556,30 @@ type IndexManager interface { // https://www.meilisearch.com/docs/reference/api/settings#reset-dictionary ResetDictionaryWithContext(ctx context.Context) (*TaskInfo, error) + // GetProximityPrecision returns ProximityPrecision configuration value + // https://www.meilisearch.com/docs/reference/api/settings#get-proximity-precision-settings + GetProximityPrecision() (ProximityPrecisionType, error) + + // GetProximityPrecisionWithContext returns ProximityPrecision configuration value and support parent context + // https://www.meilisearch.com/docs/reference/api/settings#get-proximity-precision-settings + GetProximityPrecisionWithContext(ctx context.Context) (ProximityPrecisionType, error) + + // UpdateProximityPrecision set ProximityPrecision value ByWord or ByAttribute + // https://www.meilisearch.com/docs/reference/api/settings#update-proximity-precision-settings + UpdateProximityPrecision(proximityType ProximityPrecisionType) (*TaskInfo, error) + + // UpdateProximityPrecisionWithContext set ProximityPrecision value ByWord or ByAttribute and support parent context + // https://www.meilisearch.com/docs/reference/api/settings#update-proximity-precision-settings + UpdateProximityPrecisionWithContext(ctx context.Context, proximityType ProximityPrecisionType) (*TaskInfo, error) + + // ResetProximityPrecision reset ProximityPrecision to default ByWord + // https://www.meilisearch.com/docs/reference/api/settings#reset-proximity-precision-settings + ResetProximityPrecision() (*TaskInfo, error) + + // ResetProximityPrecisionWithContext reset ProximityPrecision to default ByWord and support parent context + // https://www.meilisearch.com/docs/reference/api/settings#reset-proximity-precision-settings + ResetProximityPrecisionWithContext(ctx context.Context) (*TaskInfo, error) + // WaitForTask waits for a task to complete by its UID with the given interval. WaitForTask(taskUID int64, interval time.Duration) (*Task, error) diff --git a/index_search_test.go b/index_search_test.go index b81ea071..d0373eff 100644 --- a/index_search_test.go +++ b/index_search_test.go @@ -236,7 +236,7 @@ func TestIndex_Search(t *testing.T) { "book_id": float64(123), "title": "Pride and Prejudice", }, }, - EstimatedTotalHits: 20, + EstimatedTotalHits: 21, Offset: 0, Limit: 1, }, @@ -553,6 +553,28 @@ func TestIndex_Search(t *testing.T) { }, wantErr: false, }, + { + name: "TestIndexSearchWithMatchStrategyFrequency", + args: args{ + UID: "indexUID", + client: sv, + query: "white shirt", + request: &SearchRequest{ + MatchingStrategy: Frequency, + }, + }, + want: &SearchResponse{ + Hits: []interface{}{ + map[string]interface{}{ + "book_id": float64(1039), "title": "The Girl in the white shirt", + }, + }, + EstimatedTotalHits: 1, + Offset: 0, + Limit: 20, + }, + wantErr: false, + }, { name: "TestIndexSearchWithInvalidIndex", args: args{ @@ -1296,7 +1318,7 @@ func TestIndex_SearchWithSort(t *testing.T) { "book_id": float64(7), "title": "Don Quixote", }, }, - EstimatedTotalHits: 20, + EstimatedTotalHits: 21, Offset: 0, Limit: 4, }, diff --git a/index_settings.go b/index_settings.go index 0535341b..a82c73be 100644 --- a/index_settings.go +++ b/index_settings.go @@ -1041,3 +1041,64 @@ func (i *index) ResetNonSeparatorTokensWithContext(ctx context.Context) (*TaskIn } return resp, nil } + +func (i *index) GetProximityPrecision() (ProximityPrecisionType, error) { + return i.GetProximityPrecisionWithContext(context.Background()) +} + +func (i *index) GetProximityPrecisionWithContext(ctx context.Context) (ProximityPrecisionType, error) { + resp := new(ProximityPrecisionType) + req := &internalRequest{ + endpoint: "/indexes/" + i.uid + "/settings/proximity-precision", + method: http.MethodGet, + withRequest: nil, + withResponse: resp, + acceptedStatusCodes: []int{http.StatusOK}, + functionName: "GetProximityPrecision", + } + if err := i.client.executeRequest(ctx, req); err != nil { + return "", err + } + return *resp, nil +} + +func (i *index) UpdateProximityPrecision(proximityType ProximityPrecisionType) (*TaskInfo, error) { + return i.UpdateProximityPrecisionWithContext(context.Background(), proximityType) +} + +func (i *index) UpdateProximityPrecisionWithContext(ctx context.Context, proximityType ProximityPrecisionType) (*TaskInfo, error) { + resp := new(TaskInfo) + req := &internalRequest{ + endpoint: "/indexes/" + i.uid + "/settings/proximity-precision", + method: http.MethodPut, + withRequest: &proximityType, + withResponse: resp, + contentType: contentTypeJSON, + acceptedStatusCodes: []int{http.StatusAccepted}, + functionName: "UpdateProximityPrecision", + } + if err := i.client.executeRequest(ctx, req); err != nil { + return nil, err + } + return resp, nil +} + +func (i *index) ResetProximityPrecision() (*TaskInfo, error) { + return i.ResetProximityPrecisionWithContext(context.Background()) +} + +func (i *index) ResetProximityPrecisionWithContext(ctx context.Context) (*TaskInfo, error) { + resp := new(TaskInfo) + req := &internalRequest{ + endpoint: "/indexes/" + i.uid + "/settings/proximity-precision", + method: http.MethodDelete, + withRequest: nil, + withResponse: resp, + acceptedStatusCodes: []int{http.StatusAccepted}, + functionName: "ResetProximityPrecision", + } + if err := i.client.executeRequest(ctx, req); err != nil { + return nil, err + } + return resp, nil +} diff --git a/index_settings_test.go b/index_settings_test.go index 9eaa8e55..b565fce8 100644 --- a/index_settings_test.go +++ b/index_settings_test.go @@ -247,6 +247,7 @@ func TestIndex_GetSettings(t *testing.T) { DistinctAttribute: (*string)(nil), SearchableAttributes: []string{"*"}, SearchCutoffMs: 0, + ProximityPrecision: ByWord, DisplayedAttributes: []string{"*"}, StopWords: []string{}, Synonyms: map[string][]string(nil), @@ -271,6 +272,7 @@ func TestIndex_GetSettings(t *testing.T) { DistinctAttribute: (*string)(nil), SearchableAttributes: []string{"*"}, SearchCutoffMs: 0, + ProximityPrecision: ByWord, DisplayedAttributes: []string{"*"}, StopWords: []string{}, Synonyms: map[string][]string(nil), @@ -887,6 +889,7 @@ func TestIndex_ResetSettings(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -913,6 +916,7 @@ func TestIndex_ResetSettings(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1690,6 +1694,7 @@ func TestIndex_UpdateSettings(t *testing.T) { }, }, SearchCutoffMs: 150, + ProximityPrecision: ByAttribute, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1711,6 +1716,7 @@ func TestIndex_UpdateSettings(t *testing.T) { Pagination: &defaultPagination, Faceting: &defaultFaceting, SearchCutoffMs: 150, + ProximityPrecision: ByAttribute, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1763,6 +1769,7 @@ func TestIndex_UpdateSettings(t *testing.T) { }, }, SearchCutoffMs: 150, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1784,6 +1791,7 @@ func TestIndex_UpdateSettings(t *testing.T) { Pagination: &defaultPagination, Faceting: &defaultFaceting, SearchCutoffMs: 150, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1858,6 +1866,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1883,6 +1892,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1903,6 +1913,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1937,6 +1948,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1962,6 +1974,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -1982,6 +1995,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2016,6 +2030,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2041,6 +2056,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2061,6 +2077,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2095,6 +2112,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2120,6 +2138,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2140,6 +2159,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2174,6 +2194,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2199,6 +2220,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2219,6 +2241,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2253,6 +2276,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2278,6 +2302,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2298,6 +2323,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2332,6 +2358,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2357,6 +2384,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2377,6 +2405,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2423,6 +2452,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { SortableAttributes: []string{}, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2468,6 +2498,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { }, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2488,6 +2519,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2522,6 +2554,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { MaxTotalHits: 1200, }, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2547,6 +2580,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { MaxTotalHits: 1200, }, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2567,6 +2601,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -2598,6 +2633,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { SortableAttributes: []string{}, TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, + ProximityPrecision: ByWord, Faceting: &Faceting{ MaxValuesPerFacet: 200, SortFacetValuesBy: map[string]SortFacetType{ @@ -2626,6 +2662,7 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { SortableAttributes: []string{}, TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, + ProximityPrecision: ByWord, Faceting: &Faceting{ MaxValuesPerFacet: 200, SortFacetValuesBy: map[string]SortFacetType{ @@ -2652,6 +2689,94 @@ func TestIndex_UpdateSettingsOneByOne(t *testing.T) { TypoTolerance: &defaultTypoTolerance, Pagination: &defaultPagination, Faceting: &defaultFaceting, + ProximityPrecision: ByWord, + SeparatorTokens: make([]string, 0), + NonSeparatorTokens: make([]string, 0), + Dictionary: make([]string, 0), + }, + }, + { + name: "TestIndexUpdateJustProximityPrecision", + args: args{ + UID: "indexUID", + client: meili, + firstRequest: Settings{ + RankingRules: []string{ + "typo", "words", + }, + ProximityPrecision: ByAttribute, + }, + firstResponse: Settings{ + RankingRules: []string{ + "typo", "words", + }, + DistinctAttribute: (*string)(nil), + SearchableAttributes: []string{"*"}, + DisplayedAttributes: []string{"*"}, + StopWords: []string{}, + Synonyms: map[string][]string(nil), + FilterableAttributes: []string{}, + SortableAttributes: []string{}, + TypoTolerance: &defaultTypoTolerance, + Pagination: &defaultPagination, + ProximityPrecision: ByAttribute, + Faceting: &Faceting{ + MaxValuesPerFacet: 100, + SortFacetValuesBy: map[string]SortFacetType{ + "*": SortFacetTypeAlpha, + }, + }, + SeparatorTokens: make([]string, 0), + NonSeparatorTokens: make([]string, 0), + Dictionary: make([]string, 0), + }, + secondRequest: Settings{ + RankingRules: []string{ + "typo", "words", + }, + ProximityPrecision: ByWord, + }, + secondResponse: Settings{ + RankingRules: []string{ + "typo", "words", + }, + DistinctAttribute: (*string)(nil), + SearchableAttributes: []string{"*"}, + DisplayedAttributes: []string{"*"}, + StopWords: []string{}, + Synonyms: map[string][]string(nil), + FilterableAttributes: []string{}, + SortableAttributes: []string{}, + TypoTolerance: &defaultTypoTolerance, + Pagination: &defaultPagination, + ProximityPrecision: ByWord, + Faceting: &Faceting{ + MaxValuesPerFacet: 100, + SortFacetValuesBy: map[string]SortFacetType{ + "*": SortFacetTypeAlpha, + }, + }, + SeparatorTokens: make([]string, 0), + NonSeparatorTokens: make([]string, 0), + Dictionary: make([]string, 0), + }, + }, + wantTask: &TaskInfo{ + TaskUID: 1, + }, + wantResp: &Settings{ + RankingRules: defaultRankingRules, + DistinctAttribute: (*string)(nil), + SearchableAttributes: []string{"*"}, + DisplayedAttributes: []string{"*"}, + StopWords: []string{}, + Synonyms: map[string][]string(nil), + FilterableAttributes: []string{}, + SortableAttributes: []string{}, + TypoTolerance: &defaultTypoTolerance, + Pagination: &defaultPagination, + Faceting: &defaultFaceting, + ProximityPrecision: ByWord, SeparatorTokens: make([]string, 0), NonSeparatorTokens: make([]string, 0), Dictionary: make([]string, 0), @@ -3534,3 +3659,31 @@ func Test_NonSeparatorTokens(t *testing.T) { require.NoError(t, err) require.Equal(t, got, []string{}) } + +func Test_ProximityPrecision(t *testing.T) { + c := setup(t, "") + t.Cleanup(cleanup(c)) + + indexID := "newIndexUID" + i := c.Index(indexID) + + got, err := i.GetProximityPrecision() + require.NoError(t, err) + require.Equal(t, ByWord, got) + + task, err := i.UpdateProximityPrecision(ByAttribute) + require.NoError(t, err) + testWaitForTask(t, i, task) + + got, err = i.GetProximityPrecision() + require.NoError(t, err) + require.Equal(t, ByAttribute, got) + + task, err = i.ResetProximityPrecision() + require.NoError(t, err) + testWaitForTask(t, i, task) + + got, err = i.GetProximityPrecision() + require.NoError(t, err) + require.Equal(t, ByWord, got) +} diff --git a/main_test.go b/main_test.go index 13e7c035..7fc408e2 100644 --- a/main_test.go +++ b/main_test.go @@ -234,6 +234,7 @@ func setUpIndexForFaceting(client ServiceManager) { {BookID: 254, Title: "Lolita", Tag: "Novel", Year: 1955}, {BookID: 921, Title: "The Brothers Karamazov", Tag: "Novel", Year: 1879}, {BookID: 1032, Title: "Crime and Punishment", Tag: "Crime fiction", Year: 1866}, + {BookID: 1039, Title: "The Girl in the white shirt", Tag: "white shirt", Year: 1999}, } task, err := idx.AddDocuments(booksTest) if err != nil { diff --git a/types.go b/types.go index dd75b2a9..f23f2d07 100644 --- a/types.go +++ b/types.go @@ -44,22 +44,23 @@ type IndexesQuery struct { // Settings is the type that represents the settings in meilisearch type Settings struct { - RankingRules []string `json:"rankingRules,omitempty"` - DistinctAttribute *string `json:"distinctAttribute,omitempty"` - SearchableAttributes []string `json:"searchableAttributes,omitempty"` - Dictionary []string `json:"dictionary,omitempty"` - SearchCutoffMs int64 `json:"searchCutoffMs,omitempty"` - SeparatorTokens []string `json:"separatorTokens,omitempty"` - NonSeparatorTokens []string `json:"nonSeparatorTokens,omitempty"` - DisplayedAttributes []string `json:"displayedAttributes,omitempty"` - StopWords []string `json:"stopWords,omitempty"` - Synonyms map[string][]string `json:"synonyms,omitempty"` - FilterableAttributes []string `json:"filterableAttributes,omitempty"` - SortableAttributes []string `json:"sortableAttributes,omitempty"` - TypoTolerance *TypoTolerance `json:"typoTolerance,omitempty"` - Pagination *Pagination `json:"pagination,omitempty"` - Faceting *Faceting `json:"faceting,omitempty"` - Embedders map[string]Embedder `json:"embedders,omitempty"` + RankingRules []string `json:"rankingRules,omitempty"` + DistinctAttribute *string `json:"distinctAttribute,omitempty"` + SearchableAttributes []string `json:"searchableAttributes,omitempty"` + Dictionary []string `json:"dictionary,omitempty"` + SearchCutoffMs int64 `json:"searchCutoffMs,omitempty"` + ProximityPrecision ProximityPrecisionType `json:"proximityPrecision,omitempty"` + SeparatorTokens []string `json:"separatorTokens,omitempty"` + NonSeparatorTokens []string `json:"nonSeparatorTokens,omitempty"` + DisplayedAttributes []string `json:"displayedAttributes,omitempty"` + StopWords []string `json:"stopWords,omitempty"` + Synonyms map[string][]string `json:"synonyms,omitempty"` + FilterableAttributes []string `json:"filterableAttributes,omitempty"` + SortableAttributes []string `json:"sortableAttributes,omitempty"` + TypoTolerance *TypoTolerance `json:"typoTolerance,omitempty"` + Pagination *Pagination `json:"pagination,omitempty"` + Faceting *Faceting `json:"faceting,omitempty"` + Embedders map[string]Embedder `json:"embedders,omitempty"` } // TypoTolerance is the type that represents the typo tolerance setting in meilisearch @@ -118,9 +119,35 @@ type Stats struct { } type ( - TaskType string // TaskType is the type of a task - SortFacetType string // SortFacetType is type of facet sorting, alpha or count - TaskStatus string // TaskStatus is the status of a task. + TaskType string // TaskType is the type of a task + SortFacetType string // SortFacetType is type of facet sorting, alpha or count + TaskStatus string // TaskStatus is the status of a task. + ProximityPrecisionType string // ProximityPrecisionType accepts one of the ByWord or ByAttribute + MatchingStrategy string // MatchingStrategy one of the Last, All, Frequency +) + +const ( + // Last returns documents containing all the query terms first. If there are not enough results containing all + // query terms to meet the requested limit, Meilisearch will remove one query term at a time, + // starting from the end of the query. + Last MatchingStrategy = "last" + // All only returns documents that contain all query terms. Meilisearch will not match any more documents even + // if there aren't enough to meet the requested limit. + All MatchingStrategy = "all" + // Frequency returns documents containing all the query terms first. If there are not enough results containing + //all query terms to meet the requested limit, Meilisearch will remove one query term at a time, starting + //with the word that is the most frequent in the dataset. frequency effectively gives more weight to terms + //that appear less frequently in a set of results. + Frequency MatchingStrategy = "frequency" +) + +const ( + // ByWord calculate the precise distance between query terms. Higher precision, but may lead to longer + // indexing time. This is the default setting + ByWord ProximityPrecisionType = "byWord" + // ByAttribute determine if multiple query terms are present in the same attribute. + // Lower precision, but shorter indexing time + ByAttribute ProximityPrecisionType = "byAttribute" ) const ( @@ -361,7 +388,7 @@ type SearchRequest struct { AttributesToHighlight []string `json:"attributesToHighlight,omitempty"` HighlightPreTag string `json:"highlightPreTag,omitempty"` HighlightPostTag string `json:"highlightPostTag,omitempty"` - MatchingStrategy string `json:"matchingStrategy,omitempty"` + MatchingStrategy MatchingStrategy `json:"matchingStrategy,omitempty"` Filter interface{} `json:"filter,omitempty"` ShowMatchesPosition bool `json:"showMatchesPosition,omitempty"` ShowRankingScore bool `json:"showRankingScore,omitempty"` diff --git a/types_easyjson.go b/types_easyjson.go index 41a5e819..b859ee72 100644 --- a/types_easyjson.go +++ b/types_easyjson.go @@ -2114,6 +2114,8 @@ func easyjson6601e8cdDecodeGithubComMeilisearchMeilisearchGo15(in *jlexer.Lexer, } case "searchCutoffMs": out.SearchCutoffMs = int64(in.Int64()) + case "proximityPrecision": + out.ProximityPrecision = ProximityPrecisionType(in.String()) case "separatorTokens": if in.IsNull() { in.Skip() @@ -2430,6 +2432,16 @@ func easyjson6601e8cdEncodeGithubComMeilisearchMeilisearchGo15(out *jwriter.Writ } out.Int64(int64(in.SearchCutoffMs)) } + if in.ProximityPrecision != "" { + const prefix string = ",\"proximityPrecision\":" + if first { + first = false + out.RawString(prefix[1:]) + } else { + out.RawString(prefix) + } + out.String(string(in.ProximityPrecision)) + } if len(in.SeparatorTokens) != 0 { const prefix string = ",\"separatorTokens\":" if first { @@ -3080,7 +3092,7 @@ func easyjson6601e8cdDecodeGithubComMeilisearchMeilisearchGo18(in *jlexer.Lexer, case "highlightPostTag": out.HighlightPostTag = string(in.String()) case "matchingStrategy": - out.MatchingStrategy = string(in.String()) + out.MatchingStrategy = MatchingStrategy(in.String()) case "filter": if m, ok := out.Filter.(easyjson.Unmarshaler); ok { m.UnmarshalEasyJSON(in)