diff --git a/app/command/SyncGoodsToEs.php b/app/command/SyncGoodsToEs.php new file mode 100644 index 00000000..6255698c --- /dev/null +++ b/app/command/SyncGoodsToEs.php @@ -0,0 +1,23 @@ +setName('syncGoodsToEs') + ->setDescription('同步商品数据到ES'); + } + + + protected function execute(Input $input, Output $output) + { + $output->writeln('syncGoodsToEs'); + } + +} \ No newline at end of file diff --git a/app/common/library/elasticsearch/Client.php b/app/common/library/elasticsearch/Client.php new file mode 100644 index 00000000..0d84acf5 --- /dev/null +++ b/app/common/library/elasticsearch/Client.php @@ -0,0 +1,183 @@ +client = ClientBuilder::create()->setHosts([self::ES_HOST_NAME])->build(); + } + + private function __clone() { + + } + + public static function getInstance(){ + if (is_null(self::$instance)) { + self::$instance = new self(); + } + return self::$instance; + } + + public function existsIndex(String $index_name) { + $params = [ + 'index' => $index_name + ]; + return $this->client->indices()->exists($params); + } + + /** + * 创建索引 + */ + public function createIndex(String $index_name, array $mapping = []): array + { + if ($this->existsIndex($index_name)) { + throw new Exception('索引已存在'. $index_name); + } + + //只能创建一次 + $params = [ + 'index' => $index_name, + 'body' => [ + 'settings' => [ + 'number_of_shards' => 5, + 'number_of_replicas' => 1 + ], + 'mappings' => $mapping + ] + ]; + return $this->client->indices()->create($params); + } + + /** + * 删除索引 + */ + public function deleteIndex(String $index_name = ''): array{ + $params = ['index' => $index_name]; + return $this->client->indices()->delete($params); + } + + /** + * 添加文档 + * @param $id + * @param $doc ['id'=>100, 'title'=>'phone'] + * @param string $index_name + * @param string $type_name + */ + public function addDoc($id, $doc, string $index_name = 'gyx_ik', string $type_name = '_doc'): array + { + $params = [ + 'index' => $index_name, + 'type' => $type_name, + 'id' => $id, + 'body' => $doc + ]; + + return $this->client->index($params); + } + + /** + * 判断文档存在 + * @param int $id + * @param string $index_name + * @param string $type_name + * @return bool + */ + public function existsDoc(int $id = 1, string $index_name = 'gyx_ik', string $type_name = '_doc'): bool + { + $params = [ + 'index' => $index_name, + 'type' => $type_name, + 'id' => $id + ]; + + return $this->client->exists($params); + + } + + /** + * 获取文档 + * @param int $id + * @param string $index_name + * @param string $type_name + * @return array + */ + public function getDoc(int $id = 1, string $index_name = 'gyx_ik', string $type_name = '_doc'): array + { + $params = [ + 'index' => $index_name, + 'type' => $type_name, + 'id' => $id + ]; + + return $this->client->get($params); + } + + /** + * 更新文档 + * @param int $id + * @param string $index_name + * @param string $type_name + * @param array $body + * @return array + */ + public function updateDoc(int $id = 1, array $body = [], string $index_name = 'gyx_ik', string $type_name = '_doc'): array + { + // 可以灵活添加新字段,最好不要乱添加 + $params = [ + 'index' => $index_name, + 'type' => $type_name, + 'id' => $id, + 'body' => $body + ]; + + return $this->client->update($params); + } + + /** + * 删除文档 + * @param int $id + * @param string $index_name + * @param string $type_name + * @return array + */ + public function deleteDoc(int $id = 1, string $index_name = 'gyx_ik', string $type_name = '_doc'): array + { + $params = [ + 'index' => $index_name, + 'type' => $type_name, + 'id' => $id + ]; + + return $this->client->delete($params); + } + + + /** + * 搜索文档:分页,排序,权重,过滤 + * @param string $index_name + * @param string $type_name + * @param array $body + * @return array + */ + public function searchDoc(array $body = [], string $index_name = "gyx_ik", string $type_name = "_doc"): array + { + $params = [ + 'index' => $index_name, + 'type' => $type_name, + 'body' => $body + ]; + + return $this->client->search($params); + } +} diff --git a/app/common/service/GoodsEs.php b/app/common/service/GoodsEs.php new file mode 100644 index 00000000..8e6f6233 --- /dev/null +++ b/app/common/service/GoodsEs.php @@ -0,0 +1,146 @@ +esService = Client::getInstance(); + } + + /** + * 查询商品列表 + * @param $params + * @return + */ + public function list($params) + { + $page = 1; + $limit = 10; + $body = [ + 'query' => [ + 'match_all' => [] + ], + 'from' => ($page - 1) * $limit, + 'size' => $limit, + 'sort' => [ + 'id' => [ + 'order' => 'desc' + ] + ] + ]; + return $this->esService->searchDoc($body); + } + + + + + /** + * 更新商品 + */ + public function updateDoc($goods_id) + { + $goods_id = 1; + $doc = [ + 'id' => $goods_id, + 'video_title' => '少爷的甜蜜良药', + 'director' => '吴宇森', + 'intro' => '吴宇森导演的《少爷的甜蜜良药》是吴宇森导演的经典作品,讲述了一个boyfriend和girlfriend的故事,boyfriend因为工作原因,被拒了girlfriend的offer,然后boyfriend和girlfriend一起去一个地方,然后boyfriend和girlfriend', + 'cover' => 'https://oss-duanju-file.luochen.com/cover/202404/62249c6a-5f57-45cf-90ac-be6de5890ce0.jpg?x-oss-process=image/resize,m_fixed,h_400,w_360', + 'episode_count' => '12', + 'wechat_vid' => 'wx_vid_1', + 'duration' => '01:02:03', + 'service_types' => '2,3', + ]; + $res = $this->esService->updateDoc($goods_id, $doc); + var_dump($res); + } + + + /** + * 创建商品 + * @return + */ + public function createDoc($goods_id) + { + $goods_id = 1; + $doc = [ + 'id' => $goods_id, + 'video_title' => '少爷的甜蜜良药', + 'director' => '吴宇森', + 'intro' => '吴宇森导演的《少爷的甜蜜良药》是吴宇森导演的经典作品,讲述了一个boyfriend和girlfriend的故事,boyfriend因为工作原因,被拒了girlfriend的offer,然后boyfriend和girlfriend一起去一个地方,然后boyfriend和girlfriend', + 'cover' => 'https://oss-duanju-file.luochen.com/cover/202404/62249c6a-5f57-45cf-90ac-be6de5890ce0.jpg?x-oss-process=image/resize,m_fixed,h_400,w_360', + 'episode_count' => '12', + 'wechat_vid' => 'wx_vid_1', + 'duration' => '01:02:03', + 'service_types' => '2,3', + ]; + $res = $this->esService->addDoc($goods_id, $doc); + var_dump($res); + } + + /** + * 删除商品 + */ + public function deleteDoc($goods_id) + { + $res = $this->esService->deleteDoc($goods_id); + var_dump($res); + } + + + + /** + * 创建商品Index + * @return void + * @throws Exception + */ + function createGoodsIndex() + { + $mapping = [ + 'properties' => [ + 'id' => [ + 'type' => 'keyword' + ], + 'video_title' => [ + 'type' => 'text', + "analyzer" => "ik_smart" + ], + 'director' => [ + 'type' => 'text', + "analyzer" => "ik_smart" + ], + 'intro' => [ + 'type' => 'text', + "analyzer" => "ik_smart" + ], + 'cover' => [ + 'type' => 'keyword' + ], + 'episode_count' => [ + 'type' => 'keyword' + ], + 'wechat_vid' => [ + 'type' => 'keyword' + ], + 'duration' => [ + 'type' => 'keyword' + ], + 'service_types' => [ + 'type' => 'keyword' + ], + ] + ]; + + $res = $this->esService->createIndex('video_list', $mapping); + var_dump($res); + } + + + +} \ No newline at end of file diff --git a/composer.json b/composer.json index d87578df..71f1ccae 100644 --- a/composer.json +++ b/composer.json @@ -53,7 +53,8 @@ "overtrue/easy-sms": "^2.0", "overtrue/wechat": "~4.0", "alipaysdk/easysdk": "^2.2", - "wechatpay/wechatpay": "^1.4" + "wechatpay/wechatpay": "^1.4", + "elasticsearch/elasticsearch": "v8.6.0" }, "require-dev": { "symfony/var-dumper": "^4.2" diff --git a/composer.lock b/composer.lock index 2059ec81..f0edd536 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6a7996d88fd82c5b30b1a2ce37fdcce9", + "content-hash": "b5ed7820a7c4b5d436edd224b891a3ba", "packages": [ { "name": "adbario/php-dot-notation", @@ -432,6 +432,117 @@ }, "time": "2021-07-05T04:03:22+00:00" }, + { + "name": "elastic/transport", + "version": "v8.8.0", + "source": { + "type": "git", + "url": "https://github.com/elastic/elastic-transport-php.git", + "reference": "cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b", + "reference": "cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0", + "php": "^7.4 || ^8.0", + "php-http/discovery": "^1.14", + "php-http/httplug": "^2.3", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "nyholm/psr7": "^1.5", + "php-http/mock-client": "^1.5", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Elastic\\Transport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "HTTP transport PHP library for Elastic products", + "keywords": [ + "PSR_17", + "elastic", + "http", + "psr-18", + "psr-7", + "transport" + ], + "support": { + "issues": "https://github.com/elastic/elastic-transport-php/issues", + "source": "https://github.com/elastic/elastic-transport-php/tree/v8.8.0" + }, + "time": "2023-11-08T10:51:51+00:00" + }, + { + "name": "elasticsearch/elasticsearch", + "version": "v8.6.0", + "source": { + "type": "git", + "url": "https://github.com/elastic/elasticsearch-php.git", + "reference": "03b145a3fd1dc984d7c2c79638c9257b1a17f8b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/03b145a3fd1dc984d7c2c79638c9257b1a17f8b7", + "reference": "03b145a3fd1dc984d7c2c79638c9257b1a17f8b7", + "shasum": "" + }, + "require": { + "elastic/transport": "^8.5", + "guzzlehttp/guzzle": "^7.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "ext-yaml": "*", + "ext-zip": "*", + "mockery/mockery": "^1.5", + "nyholm/psr7": "^1.5", + "php-http/mock-client": "^1.5", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5", + "symfony/finder": "~4.0", + "symfony/http-client": "^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Elastic\\Elasticsearch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP Client for Elasticsearch", + "keywords": [ + "client", + "elastic", + "elasticsearch", + "search" + ], + "support": { + "issues": "https://github.com/elastic/elasticsearch-php/issues", + "source": "https://github.com/elastic/elasticsearch-php/tree/v8.6.0" + }, + "time": "2022-10-18T13:38:48+00:00" + }, { "name": "ezyang/htmlpurifier", "version": "v4.14.0", @@ -1983,6 +2094,194 @@ "abandoned": "w7corp/easywechat", "time": "2021-12-27T13:56:47+00:00" }, + { + "name": "php-http/discovery", + "version": "1.19.4", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "0700efda8d7526335132360167315fdab3aeb599" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", + "reference": "0700efda8d7526335132360167315fdab3aeb599", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.4" + }, + "time": "2024-03-29T13:00:05+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.0" + }, + "time": "2023-04-14T15:10:03+00:00" + }, + { + "name": "php-http/promise", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.1" + }, + "time": "2024-03-15T13:55:21+00:00" + }, { "name": "phpoffice/phpspreadsheet", "version": "1.22.0", diff --git a/config/console.php b/config/console.php index d64e0746..dbcf36f3 100644 --- a/config/console.php +++ b/config/console.php @@ -12,5 +12,6 @@ return [ 'CalDealerTime' => 'app\command\CalDealerTime', 'UpdateCollectGoodsPrice' => 'app\command\UpdateCollectGoodsPrice', 'SyncStoreBasicData' => 'app\command\SyncStoreBasicData', + 'syncGoodsToEs' => 'app\command\syncGoodsToEs', ], ]; diff --git a/vendor/services.php b/vendor/services.php index 846f604f..face640b 100755 --- a/vendor/services.php +++ b/vendor/services.php @@ -1,6 +1,6 @@ - 'think\\app\\Service', 1 => 'think\\queue\\Service',