From 2fbca6fb1a8f4b1e3f93227eff9ffdc7ef3e3358 Mon Sep 17 00:00:00 2001 From: ManyTheFish Date: Tue, 8 Oct 2024 16:20:47 +0200 Subject: [PATCH 1/4] embedder is now a mandatory field --- tests/Endpoints/SearchTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Endpoints/SearchTest.php b/tests/Endpoints/SearchTest.php index dbd6cac3..eea4046c 100644 --- a/tests/Endpoints/SearchTest.php +++ b/tests/Endpoints/SearchTest.php @@ -701,12 +701,12 @@ public function testVectorSearch(): void $this->assertIsValidPromise($promise); $index->waitForTask($promise['taskUid']); - $response = $index->search('', ['vector' => [-0.5, 0.3, 0.85], 'hybrid' => ['semanticRatio' => 1.0]]); + $response = $index->search('', ['vector' => [-0.5, 0.3, 0.85], 'hybrid' => ['semanticRatio' => 1.0, 'embedder' => 'manual']]); self::assertSame(5, $response->getSemanticHitCount()); self::assertArrayNotHasKey('_vectors', $response->getHit(0)); - $response = $index->search('', ['vector' => [-0.5, 0.3, 0.85], 'hybrid' => ['semanticRatio' => 1.0], 'retrieveVectors' => true]); + $response = $index->search('', ['vector' => [-0.5, 0.3, 0.85], 'hybrid' => ['semanticRatio' => 1.0, 'embedder' => 'manual'], 'retrieveVectors' => true]); self::assertSame(5, $response->getSemanticHitCount()); self::assertArrayHasKey('_vectors', $response->getHit(0)); From f1bc0cbf8989b35f02ff63ea8ca00be1bfe8ebec Mon Sep 17 00:00:00 2001 From: ManyTheFish Date: Tue, 8 Oct 2024 16:16:10 +0200 Subject: [PATCH 2/4] Add Embedder tests --- tests/Settings/EmbeddersTest.php | 57 ++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tests/Settings/EmbeddersTest.php diff --git a/tests/Settings/EmbeddersTest.php b/tests/Settings/EmbeddersTest.php new file mode 100644 index 00000000..805d7c5b --- /dev/null +++ b/tests/Settings/EmbeddersTest.php @@ -0,0 +1,57 @@ +host, getenv('MEILISEARCH_API_KEY')); + $http->patch('/experimental-features', ['vectorStore' => true]); + $this->index = $this->createEmptyIndex($this->safeIndexName()); + } + + public function testGetDefaultEmbedders(): void + { + $response = $this->index->getEmbedders(); + + self::assertSame(self::DEFAULT_EMBEDDER, $response); + } + + public function testUpdateEmbedders(): void + { + $newEmbedders = ['manual' => ['source' => 'userProvided', 'dimensions' => 3, 'binaryQuantized' => true]]; + + $promise = $this->index->updateEmbedders($newEmbedders); + + $this->assertIsValidPromise($promise); + $this->index->waitForTask($promise['taskUid']); + + $embedders = $this->index->getEmbedders(); + + self::assertSame($newEmbedders, $embedders); + } + + public function testResetEmbedders(): void + { + $promise = $this->index->resetEmbedders(); + + $this->assertIsValidPromise($promise); + + $this->index->waitForTask($promise['taskUid']); + $embedders = $this->index->getEmbedders(); + + self::assertSame(self::DEFAULT_EMBEDDER, $embedders); + } +} From 6e038a3b7065e464ff91c403583232ec0de3bebe Mon Sep 17 00:00:00 2001 From: ManyTheFish Date: Tue, 8 Oct 2024 15:53:37 +0200 Subject: [PATCH 3/4] Make embedder field mandatory in SimilarDocumentsQuery --- .code-samples.meilisearch.yaml | 2 +- src/Contracts/SimilarDocumentsQuery.php | 32 ++++-------- tests/Contracts/SimilarDocumentsQueryTest.php | 52 ++++++++----------- tests/Endpoints/SimilarDocumentsTest.php | 4 +- 4 files changed, 37 insertions(+), 53 deletions(-) diff --git a/.code-samples.meilisearch.yaml b/.code-samples.meilisearch.yaml index 35697bcf..535134d8 100644 --- a/.code-samples.meilisearch.yaml +++ b/.code-samples.meilisearch.yaml @@ -742,7 +742,7 @@ distinct_attribute_guide_distinct_parameter_1: |- search_parameter_guide_matching_strategy_3: |- $client->index('movies')->search('white shirt', ['matchingStrategy' => 'frequency']); get_similar_post_1: |- - $similarQuery = new SimilarDocumentsQuery('TARGET_DOCUMENT_ID'); + $similarQuery = new SimilarDocumentsQuery('TARGET_DOCUMENT_ID', 'default'); $client->index('INDEX_NAME')->searchSimilarDocuments($similarQuery); multi_search_federated_1: |- $client->multiSearch([ diff --git a/src/Contracts/SimilarDocumentsQuery.php b/src/Contracts/SimilarDocumentsQuery.php index ab6dc95b..04c65ae3 100644 --- a/src/Contracts/SimilarDocumentsQuery.php +++ b/src/Contracts/SimilarDocumentsQuery.php @@ -11,6 +11,11 @@ class SimilarDocumentsQuery */ private $id; + /** + * @var non-empty-string + */ + private string $embedder; + /** * @var non-negative-int|null */ @@ -21,11 +26,6 @@ class SimilarDocumentsQuery */ private ?int $limit = null; - /** - * @var non-empty-string|null - */ - private ?string $embedder = null; - /** * @var list|null */ @@ -48,11 +48,13 @@ class SimilarDocumentsQuery private $rankingScoreThreshold; /** - * @param int|string $id + * @param int|string $id + * @param non-empty-string $embedder */ - public function __construct($id) + public function __construct($id, string $embedder) { $this->id = $id; + $this->embedder = $embedder; } /** @@ -91,18 +93,6 @@ public function setFilter(array $filter): self return $this; } - /** - * @param non-empty-string $embedder - * - * @return $this - */ - public function setEmbedder(string $embedder): self - { - $this->embedder = $embedder; - - return $this; - } - /** * @param list $attributesToRetrieve an array of attribute names to retrieve * @@ -166,10 +156,10 @@ public function setRankingScoreThreshold($rankingScoreThreshold): self /** * @return array{ * id: int|string, + * embedder: non-empty-string, * offset?: non-negative-int, * limit?: positive-int, * filter?: array|string>, - * embedder?: non-empty-string, * attributesToRetrieve?: list, * showRankingScore?: bool, * showRankingScoreDetails?: bool, @@ -181,10 +171,10 @@ public function toArray(): array { return array_filter([ 'id' => $this->id, + 'embedder' => $this->embedder, 'offset' => $this->offset, 'limit' => $this->limit, 'filter' => $this->filter, - 'embedder' => $this->embedder, 'attributesToRetrieve' => $this->attributesToRetrieve, 'showRankingScore' => $this->showRankingScore, 'showRankingScoreDetails' => $this->showRankingScoreDetails, diff --git a/tests/Contracts/SimilarDocumentsQueryTest.php b/tests/Contracts/SimilarDocumentsQueryTest.php index 79785d92..88cbe6e1 100644 --- a/tests/Contracts/SimilarDocumentsQueryTest.php +++ b/tests/Contracts/SimilarDocumentsQueryTest.php @@ -10,54 +10,48 @@ final class SimilarDocumentsQueryTest extends TestCase { /** - * @param int|string $id + * @param int|string $id + * @param non-empty-string $embedder * - * @testWith [123] - * ["test"] + * @testWith [123, "default"] + * ["test", "manual"] */ - public function testConstruct($id): void + public function testConstruct($id, string $embedder): void { - $data = new SimilarDocumentsQuery($id); + $data = new SimilarDocumentsQuery($id, $embedder); - self::assertSame(['id' => $id], $data->toArray()); + self::assertSame(['id' => $id, 'embedder' => $embedder], $data->toArray()); } public function testSetOffset(): void { - $data = (new SimilarDocumentsQuery('test'))->setOffset(66); + $data = (new SimilarDocumentsQuery('test', 'default'))->setOffset(66); - self::assertSame(['id' => 'test', 'offset' => 66], $data->toArray()); + self::assertSame(['id' => 'test', 'embedder' => 'default', 'offset' => 66], $data->toArray()); } public function testSetLimit(): void { - $data = (new SimilarDocumentsQuery('test'))->setLimit(50); + $data = (new SimilarDocumentsQuery('test', 'default'))->setLimit(50); - self::assertSame(['id' => 'test', 'limit' => 50], $data->toArray()); + self::assertSame(['id' => 'test', 'embedder' => 'default', 'limit' => 50], $data->toArray()); } public function testSetFilter(): void { - $data = (new SimilarDocumentsQuery('test'))->setFilter([ + $data = (new SimilarDocumentsQuery('test', 'default'))->setFilter([ ['genres = horror', 'genres = mystery'], "director = 'Jordan Peele'", ]); - self::assertSame(['id' => 'test', 'filter' => [['genres = horror', 'genres = mystery'], "director = 'Jordan Peele'"]], $data->toArray()); - } - - public function testSetEmbedder(): void - { - $data = (new SimilarDocumentsQuery('test'))->setEmbedder('default'); - - self::assertSame(['id' => 'test', 'embedder' => 'default'], $data->toArray()); + self::assertSame(['id' => 'test', 'embedder' => 'default', 'filter' => [['genres = horror', 'genres = mystery'], "director = 'Jordan Peele'"]], $data->toArray()); } public function testSetAttributesToRetrieve(): void { - $data = (new SimilarDocumentsQuery('test'))->setAttributesToRetrieve(['name', 'price']); + $data = (new SimilarDocumentsQuery('test', 'default'))->setAttributesToRetrieve(['name', 'price']); - self::assertSame(['id' => 'test', 'attributesToRetrieve' => ['name', 'price']], $data->toArray()); + self::assertSame(['id' => 'test', 'embedder' => 'default', 'attributesToRetrieve' => ['name', 'price']], $data->toArray()); } /** @@ -66,9 +60,9 @@ public function testSetAttributesToRetrieve(): void */ public function testSetShowRankingScore(bool $showRankingScore): void { - $data = (new SimilarDocumentsQuery('test'))->setShowRankingScore($showRankingScore); + $data = (new SimilarDocumentsQuery('test', 'default'))->setShowRankingScore($showRankingScore); - self::assertSame(['id' => 'test', 'showRankingScore' => $showRankingScore], $data->toArray()); + self::assertSame(['id' => 'test', 'embedder' => 'default', 'showRankingScore' => $showRankingScore], $data->toArray()); } /** @@ -77,9 +71,9 @@ public function testSetShowRankingScore(bool $showRankingScore): void */ public function testSetShowRankingScoreDetails(bool $showRankingScoreDetails): void { - $data = (new SimilarDocumentsQuery('test'))->setShowRankingScoreDetails($showRankingScoreDetails); + $data = (new SimilarDocumentsQuery('test', 'default'))->setShowRankingScoreDetails($showRankingScoreDetails); - self::assertSame(['id' => 'test', 'showRankingScoreDetails' => $showRankingScoreDetails], $data->toArray()); + self::assertSame(['id' => 'test', 'embedder' => 'default', 'showRankingScoreDetails' => $showRankingScoreDetails], $data->toArray()); } /** @@ -88,9 +82,9 @@ public function testSetShowRankingScoreDetails(bool $showRankingScoreDetails): v */ public function testSetRetrieveVectors(bool $retrieveVectors): void { - $data = (new SimilarDocumentsQuery('test'))->setRetrieveVectors($retrieveVectors); + $data = (new SimilarDocumentsQuery('test', 'default'))->setRetrieveVectors($retrieveVectors); - self::assertSame(['id' => 'test', 'retrieveVectors' => $retrieveVectors], $data->toArray()); + self::assertSame(['id' => 'test', 'embedder' => 'default', 'retrieveVectors' => $retrieveVectors], $data->toArray()); } /** @@ -101,8 +95,8 @@ public function testSetRetrieveVectors(bool $retrieveVectors): void */ public function testSetRankingScoreThreshold($rankingScoreThreshold): void { - $data = (new SimilarDocumentsQuery('test'))->setRankingScoreThreshold($rankingScoreThreshold); + $data = (new SimilarDocumentsQuery('test', 'default'))->setRankingScoreThreshold($rankingScoreThreshold); - self::assertSame(['id' => 'test', 'rankingScoreThreshold' => $rankingScoreThreshold], $data->toArray()); + self::assertSame(['id' => 'test', 'embedder' => 'default', 'rankingScoreThreshold' => $rankingScoreThreshold], $data->toArray()); } } diff --git a/tests/Endpoints/SimilarDocumentsTest.php b/tests/Endpoints/SimilarDocumentsTest.php index 20ce0048..c5d6e40c 100644 --- a/tests/Endpoints/SimilarDocumentsTest.php +++ b/tests/Endpoints/SimilarDocumentsTest.php @@ -30,14 +30,14 @@ public function testBasicSearchWithSimilarDocuments(): void self::assertSame(1, $response->getHitsCount()); $documentId = $response->getHit(0)['id']; - $response = $this->index->searchSimilarDocuments(new SimilarDocumentsQuery($documentId)); + $response = $this->index->searchSimilarDocuments(new SimilarDocumentsQuery($documentId, 'manual')); self::assertGreaterThanOrEqual(4, $response->getHitsCount()); self::assertArrayNotHasKey('_vectors', $response->getHit(0)); self::assertArrayHasKey('id', $response->getHit(0)); self::assertSame($documentId, $response->getId()); - $similarQuery = new SimilarDocumentsQuery($documentId); + $similarQuery = new SimilarDocumentsQuery($documentId, 'manual'); $response = $this->index->searchSimilarDocuments($similarQuery->setRetrieveVectors(true)); self::assertGreaterThanOrEqual(4, $response->getHitsCount()); self::assertArrayHasKey('_vectors', $response->getHit(0)); From a812bc156f7f0790ba5f1cb806c7f06de5fb2bfe Mon Sep 17 00:00:00 2001 From: Many the fish Date: Wed, 9 Oct 2024 07:22:36 +0200 Subject: [PATCH 4/4] Update tests/Settings/EmbeddersTest.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tomas Norkūnas --- tests/Settings/EmbeddersTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Settings/EmbeddersTest.php b/tests/Settings/EmbeddersTest.php index 805d7c5b..35497559 100644 --- a/tests/Settings/EmbeddersTest.php +++ b/tests/Settings/EmbeddersTest.php @@ -12,7 +12,7 @@ final class EmbeddersTest extends TestCase { private Indexes $index; - public const DEFAULT_EMBEDDER = null; + private const DEFAULT_EMBEDDER = null; protected function setUp(): void {