Skip to content

Commit 87bc862

Browse files
meili-bors[bot]meili-botbrunoocasalicurquiza
authored
Merge #600
600: Changes related to the next Meilisearch release (v1.6.0) r=brunoocasali a=meili-bot Related to this issue: meilisearch/integration-guides#294 This PR: - gathers the changes related to the next Meilisearch release (v1.6.0) so that this package is ready when the official release is out. - should pass the tests against the [latest pre-release of Meilisearch](https://github.com/meilisearch/meilisearch/releases). - might eventually contain test failures until the Meilisearch v1.6.0 is out. ⚠️ This PR should NOT be merged until the next release of Meilisearch (v1.6.0) is out. _This PR is auto-generated for the [pre-release week](https://github.com/meilisearch/integration-guides/blob/main/resources/pre-release-week.md) purpose._ Co-authored-by: meili-bot <[email protected]> Co-authored-by: Bruno Casali <[email protected]> Co-authored-by: Clémentine U. - curqui <[email protected]>
2 parents 404a2ba + 5440a6a commit 87bc862

File tree

8 files changed

+237
-23
lines changed

8 files changed

+237
-23
lines changed

.code-samples.meilisearch.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,3 +697,9 @@ update_non_separator_tokens_1: |-
697697
$client->index('articles')->updateNonSeparatorTokens(['@', '#']);
698698
reset_non_separator_tokens_1: |-
699699
$client->index('articles')->resetNonSeparatorTokens();
700+
get_proximity_precision_settings_1: |-
701+
$client->index('books')->getProximityPrecision();
702+
update_proximity_precision_settings_1: |-
703+
$client->index('books')->updateProximityPrecision('byAttribute');
704+
reset_proximity_precision_settings_1: |-
705+
$client->index('books')->resetProximityPrecision();

src/Contracts/Index/Embedders.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Meilisearch\Contracts\Index;
6+
7+
use Meilisearch\Contracts\Data;
8+
9+
class Embedders extends Data implements \JsonSerializable
10+
{
11+
public function jsonSerialize(): object
12+
{
13+
return (object) $this->getIterator()->getArrayCopy();
14+
}
15+
}

src/Contracts/Index/Settings.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ public function __construct(array $data = [])
1313
$data['synonyms'] = new Synonyms($data['synonyms'] ?? []);
1414
$data['typoTolerance'] = new TypoTolerance($data['typoTolerance'] ?? []);
1515
$data['faceting'] = new Faceting($data['faceting'] ?? []);
16+
if (\array_key_exists('embedders', $data)) {
17+
$data['embedders'] = new Embedders($data['embedders'] ?? []);
18+
}
1619

1720
parent::__construct($data);
1821
}

src/Endpoints/Delegates/HandlesSettings.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,4 +341,41 @@ public function resetNonSeparatorTokens(): array
341341
{
342342
return $this->http->delete(self::PATH.'/'.$this->uid.'/settings/non-separator-tokens');
343343
}
344+
345+
// Settings - proximityPrecision
346+
347+
/**
348+
* @return non-empty-string
349+
*/
350+
public function getProximityPrecision(): string
351+
{
352+
return $this->http->get(self::PATH.'/'.$this->uid.'/settings/proximity-precision');
353+
}
354+
355+
public function updateProximityPrecision(string $type): array
356+
{
357+
return $this->http->put(self::PATH.'/'.$this->uid.'/settings/proximity-precision', $type);
358+
}
359+
360+
public function resetProximityPrecision(): array
361+
{
362+
return $this->http->delete(self::PATH.'/'.$this->uid.'/settings/proximity-precision');
363+
}
364+
365+
// Settings - Experimental: Embedders (hybrid search)
366+
367+
public function getEmbedders(): ?array
368+
{
369+
return $this->http->get(self::PATH.'/'.$this->uid.'/settings/embedders');
370+
}
371+
372+
public function updateEmbedders(array $embedders): array
373+
{
374+
return $this->http->patch(self::PATH.'/'.$this->uid.'/settings/embedders', $embedders);
375+
}
376+
377+
public function resetEmbedders(): array
378+
{
379+
return $this->http->delete(self::PATH.'/'.$this->uid.'/settings/embedders');
380+
}
344381
}

tests/Endpoints/SearchTest.php

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -692,19 +692,15 @@ public function testVectorSearch(): void
692692
{
693693
$http = new Client($this->host, getenv('MEILISEARCH_API_KEY'));
694694
$http->patch('/experimental-features', ['vectorStore' => true]);
695+
$index = $this->createEmptyIndex($this->safeIndexName());
695696

696-
$response = $this->index->addDocuments([
697-
['id' => 32, 'title' => 'The Witcher', '_vectors' => [1, 0.3]],
698-
['id' => 32, 'title' => 'Interestellar', '_vectors' => [0.5, 0.53]],
699-
]);
700-
$this->index->waitForTask($response['taskUid']);
697+
$promise = $index->updateEmbedders(['default' => ['source' => 'userProvided', 'dimensions' => 1]]);
698+
$this->assertIsValidPromise($promise);
699+
$index->waitForTask($promise['taskUid']);
701700

702-
$response = $this->index->search('', ['vector' => [1, 0.5921]]);
703-
$hit = $response->getHits()[0];
701+
$response = $index->search('', ['vector' => [1], 'hybrid' => ['semanticRatio' => 1.0]]);
704702

705-
$this->assertEquals($hit['title'], 'Interestellar');
706-
$this->assertEquals($hit['_vectors'], [0.5, 0.53]);
707-
$this->assertArrayHasKey('_semanticScore', $hit);
703+
$this->assertEmpty($response->getHits());
708704
}
709705

710706
public function testShowRankingScoreDetails(): void

tests/Settings/EmbeddersTest.php

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Settings;
6+
7+
use Meilisearch\Http\Client;
8+
use Tests\TestCase;
9+
10+
final class EmbeddersTest extends TestCase
11+
{
12+
protected function setUp(): void
13+
{
14+
parent::setUp();
15+
16+
$http = new Client($this->host, getenv('MEILISEARCH_API_KEY'));
17+
$http->patch('/experimental-features', ['vectorStore' => true]);
18+
}
19+
20+
public function testGetEmbedders(): void
21+
{
22+
$index = $this->createEmptyIndex($this->safeIndexName('books-1'));
23+
$embedders = $index->getEmbedders();
24+
25+
$this->assertEmpty($embedders);
26+
}
27+
28+
public function testUpdateEmbeddersWithOpenAi(): void
29+
{
30+
$embedderConfig = [
31+
'source' => 'openAi',
32+
'apiKey' => '<your-OpenAI-API-key>',
33+
'model' => 'text-embedding-ada-002',
34+
'documentTemplate' => "A movie titled '{{doc.title}}' whose description starts with {{doc.overview|truncatewords: 20}}",
35+
];
36+
$index = $this->createEmptyIndex($this->safeIndexName());
37+
38+
$promise = $index->updateEmbedders(['myEmbedder' => $embedderConfig]);
39+
40+
$this->assertIsValidPromise($promise);
41+
$index->waitForTask($promise['taskUid']);
42+
43+
$embedders = $index->getEmbedders();
44+
45+
$this->assertEquals($embedderConfig, $embedders['myEmbedder']);
46+
}
47+
48+
public function testUpdateEmbeddersWithUserProvided(): void
49+
{
50+
$embedderConfig = [
51+
'source' => 'userProvided',
52+
'dimensions' => 1,
53+
];
54+
$index = $this->createEmptyIndex($this->safeIndexName());
55+
56+
$promise = $index->updateEmbedders(['myEmbedder' => $embedderConfig]);
57+
58+
$this->assertIsValidPromise($promise);
59+
$index->waitForTask($promise['taskUid']);
60+
61+
$embedders = $index->getEmbedders();
62+
63+
$this->assertEquals($embedderConfig, $embedders['myEmbedder']);
64+
}
65+
66+
public function testUpdateEmbeddersWithHuggingFace(): void
67+
{
68+
$embedderConfig = [
69+
'source' => 'huggingFace',
70+
'model' => 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2',
71+
'documentTemplate' => "A movie titled '{{doc.title}}' whose description starts with {{doc.overview|truncatewords: 20}}",
72+
];
73+
$index = $this->createEmptyIndex($this->safeIndexName());
74+
75+
$promise = $index->updateEmbedders(['myEmbedder' => $embedderConfig]);
76+
77+
$this->assertIsValidPromise($promise);
78+
$index->waitForTask($promise['taskUid']);
79+
80+
$embedders = $index->getEmbedders();
81+
82+
$this->assertEquals($embedderConfig, $embedders['myEmbedder']);
83+
}
84+
85+
public function testResetEmbedders(): void
86+
{
87+
$embedderConfig = [
88+
'source' => 'userProvided',
89+
'dimensions' => 1,
90+
];
91+
$index = $this->createEmptyIndex($this->safeIndexName());
92+
93+
$promise = $index->updateEmbedders(['myEmbedder' => $embedderConfig]);
94+
$this->assertIsValidPromise($promise);
95+
$index->waitForTask($promise['taskUid']);
96+
97+
$promise = $index->resetEmbedders();
98+
$this->assertIsValidPromise($promise);
99+
$index->waitForTask($promise['taskUid']);
100+
101+
$this->assertEmpty($index->getEmbedders());
102+
}
103+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Settings;
6+
7+
use Meilisearch\Endpoints\Indexes;
8+
use Tests\TestCase;
9+
10+
final class ProximityPrecisionTest extends TestCase
11+
{
12+
private Indexes $index;
13+
14+
protected function setUp(): void
15+
{
16+
parent::setUp();
17+
$this->index = $this->createEmptyIndex($this->safeIndexName());
18+
}
19+
20+
public function testGetDefaultProximityPrecision(): void
21+
{
22+
$default = $this->index->getProximityPrecision();
23+
24+
$this->assertSame('byWord', $default);
25+
}
26+
27+
public function testUpdateProximityPrecision(): void
28+
{
29+
$promise = $this->index->updateProximityPrecision('byAttribute');
30+
$this->assertIsValidPromise($promise);
31+
$this->index->waitForTask($promise['taskUid']);
32+
33+
$this->assertSame('byAttribute', $this->index->getProximityPrecision());
34+
}
35+
36+
public function testResetProximityPrecision(): void
37+
{
38+
$promise = $this->index->updateProximityPrecision('byAttribute');
39+
$this->assertIsValidPromise($promise);
40+
$this->index->waitForTask($promise['taskUid']);
41+
42+
$promise = $this->index->resetProximityPrecision();
43+
44+
$this->assertIsValidPromise($promise);
45+
$this->index->waitForTask($promise['taskUid']);
46+
47+
$this->assertSame('byWord', $this->index->getProximityPrecision());
48+
}
49+
}

tests/Settings/SettingsTest.php

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,22 @@ public function testResetSettings(): void
187187
}
188188

189189
// Here the test to prevent https://github.com/meilisearch/meilisearch-php/issues/204.
190-
public function testGetThenUpdateSettings(): void
191-
{
192-
$index = $this->createEmptyIndex($this->safeIndexName());
193-
194-
$resetPromise = $index->resetSettings();
195-
$this->assertIsValidPromise($resetPromise);
196-
$index->waitForTask($resetPromise['taskUid']);
197-
198-
$settings = $index->getSettings();
199-
$promise = $index->updateSettings($settings);
200-
$this->assertIsValidPromise($promise);
201-
$index->waitForTask($promise['taskUid']);
202-
}
190+
// Rollback this comment after meilisearch v1.6.0 final release.
191+
// Related to: https://github.com/meilisearch/meilisearch/issues/4323
192+
//
193+
// public function testGetThenUpdateSettings(): void
194+
// {
195+
// $http = new \Meilisearch\Http\Client($this->host, getenv('MEILISEARCH_API_KEY'));
196+
// $http->patch('/experimental-features', ['vectorStore' => false]);
197+
// $index = $this->createEmptyIndex($this->safeIndexName());
198+
199+
// $resetPromise = $index->resetSettings();
200+
// $this->assertIsValidPromise($resetPromise);
201+
// $index->waitForTask($resetPromise['taskUid']);
202+
203+
// $settings = $index->getSettings();
204+
// $promise = $index->updateSettings($settings);
205+
// $this->assertIsValidPromise($promise);
206+
// $index->waitForTask($promise['taskUid']);
207+
// }
203208
}

0 commit comments

Comments
 (0)