<?php namespace IQDEV\ElasticSearchTests\Seed; use IQDEV\ElasticSearch\Config\BaseConfiguration; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Document\ProductDocument; use IQDEV\ElasticSearch\Facet\FacetCategory; use IQDEV\ElasticSearch\Facet\FacetKeyword; use IQDEV\ElasticSearch\Facet\FacetNumber; use IQDEV\ElasticSearch\Indexer\AddIndex; use IQDEV\ElasticSearch\Indexer\IndexProvider; use IQDEV\ElasticSearch\Indexer\IndexRunner; use IQDEV\ElasticSearchTests\Factory\ClientFactory; use Psr\Log\Test\TestLogger; class DefaultSeed { private IndexRunner $indexRunner; private Configuration $configuration; public function __construct() { $this->configuration = new BaseConfiguration(); $this->indexRunner = new IndexRunner( ClientFactory::create(), $this->configuration, new TestLogger() ); } public function start() { $provider = new class implements IndexProvider { public function get(): \Generator { $products = [ [ 'id' => 's1', 'name' => 'Кроссовки NMD_R1 Boba Fett Spectoo', 'category' => 'shoes', 'properties' => ['brand' => 'adidas', 'color' => 'green', 'size' => 46,'price' => 100] ], [ 'id' => 's2', 'name' => 'КРОССОВКИ ULTRABOOST 5.0 DNA', 'category' => 'shoes', 'properties' => ['brand' => 'adidas', 'color' => 'red', 'size' => 47,'price' => 101] ], [ 'id' => 's3', 'name' => 'Кроссовки Reebok Royal Techque', 'category' => 'shoes', 'properties' => ['brand' => 'rebook', 'color' => 'blue', 'size' => 47,'price' => 102] ], [ 'id' => 's4', 'name' => 'Nike Air Zoom Pegasus 39', 'category' => 'shoes', 'properties' => ['brand' => 'nike', 'color' => 'green', 'size' => 43,'price' => 103] ], [ 'id' => 'h1', 'name' => 'Nike Dri-FIT Strike', 'category' => 't-short', 'properties' => ['brand' => 'nike', 'color' => 'red', 'size' => 'xl','price' => 104] ], [ 'id' => 'h2', 'name' => 'Nike Dri-FIT Rise 365', 'category' => 't-short', 'properties' => ['brand' => 'nike', 'color' => 'white', 'size' => 'xxl','price' => 105] ], [ 'id' => 'h3', 'name' => 'Компрессионная Футболка ACTIVCHILL Graphic Move', 'category' => 't-short', 'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 106] ], [ 'id' => 'p1', 'name' => 'Товар с ценой', 'category' => 'prices', 'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 107] ], ]; foreach ($products as $product) { $document = new ProductDocument(new FacetCategory($product['category'])); //todo по-хорошему нужны базовые классы, которые будут описывать свойства // и формировать структуру для последующей обработки $document->setAdditionData([ 'id' => $product['id'], 'title' => $product['name'], ]); foreach ($product['properties'] as $key => $prop) { if ($key === 'price') { $document->getNumberFacets()->add(new FacetNumber($key, $prop)); } else { $document->getKeywordFacets()->add(new FacetKeyword($key, $prop)); } } $document->setSearchContent($product['name']); yield new AddIndex( $_ENV['IQ_ES_PRODUCT_SEARCH_INDEX'], $document, $product['id'] ); } } public function setBatchSize(int $size): void { } public function getBatchSize(): ?int { return null; } public function setLimit(int $limit): void { } public function getLimit(): ?int { return null; } }; $this->indexRunner->run($provider); } }