Merge branch 'es'

main
ztt 8 months ago
commit 3a221d9db9
  1. 55
      app/api/controller/GoodsNew.php
  2. 2
      app/command/SyncGoodsToEs.php
  3. 26
      app/common/library/elasticsearch/Client.php
  4. 359
      app/common/service/GoodsEs.php

@ -4,6 +4,7 @@ namespace app\api\controller;
use app\common\service\GoodsEs;
use think\App;
class GoodsNew extends Controller
{
@ -13,4 +14,58 @@ class GoodsNew extends Controller
$data = $goodsService->list([]);
dd($data);
}
public function search()
{
$keyword = $this->request->param('keyword');
$page = $this->request->param('page', 1);
$limit = $this->request->param('limit', 10);
$params = ['goods_name' => $keyword];
$goodsService = new GoodsEs();
$data = $goodsService->list($params, $page, $limit);
$this->renderSuccess($data);
}
/**
* 添加商品
*/
public function add()
{
$goods_id = 1;
$goods_data = \app\common\model\Goods::where('goods_id', '=', $goods_id)
->order('goods_id desc')
->find()
->toArray();
$goodsService = new GoodsEs();
$data = $goodsService->createData($goods_id, $goods_data);
$this->renderSuccess($data);
}
/**
* 更新商品
*/
public function update()
{
$goods_id = 1;
$update = [
'goods_name' => '测试商品',
'selling_point' => '测试商品',
'goods_price_min' => 100,
'goods_price_max' => 100,
];
$goodsService = new GoodsEs();
$data = $goodsService->updateData($goods_id, $update);
$this->renderSuccess($data);
}
/**
* 删除
*/
public function delete()
{
$goods_id = 1;
$goodsService = new GoodsEs();
$data = $goodsService->delete($goods_id);
$this->renderSuccess($data);
}
}

@ -21,7 +21,7 @@ class SyncGoodsToEs extends Command
protected function execute(Input $input, Output $output)
{
$goodsService = new GoodsEs();
$goods = $goodsService->list([]);
$goods = $goodsService->list();
var_dump($goods);
}

@ -256,12 +256,14 @@ class Client
}
if (!empty($this->queryParams['order'])) {
$queryParams['body']['sort'] = [
key($this->queryParams['order']) => [
'order' => current($this->queryParams['order'])
foreach ($this->queryParams['order'] as $key => $row) {
$queryParams['body']['sort'][] = [
key($row) => [
'order' => current($row)
]
];
}
}
$queryParams['body']['query']['bool']['filter'] = $filter;
@ -349,7 +351,7 @@ class Client
* @param string $index_name
* @param string $type_name
*/
public function addDoc($id, $doc, string $type_name = '_doc'): array
public function addDoc($id, $doc, string $type_name = '_doc')
{
$params = [
'index' => $this->index,
@ -386,8 +388,8 @@ class Client
protected function settings()
{
return [
'number_of_shards' => 5,
'number_of_replicas' => 1
'number_of_shards' => 1,
'number_of_replicas' => 0
];
}
@ -484,9 +486,9 @@ class Client
$check = $this->indices()->exists($params);
if ($check) {
throw new Exception('index: ' . $this->index . ' already exists');
}
// if ($check) {
// throw new Exception('index: ' . $this->index . ' already exists');
// }
$params = [
'index' => $this->index,
@ -655,12 +657,12 @@ class Client
}
/**
* 更新索引
* @return array @todo
*/
public function updateIndex()
public function updateIndex($mappings)
{
@ -672,7 +674,7 @@ class Client
'body' => [
'properties' => $this->mappings()
'properties' => $mappings
]

@ -8,11 +8,11 @@ class GoodsEs
{
private Client $esService;
private $index_name = 'goods_list';
private string $index_name = 'goods_list';
public function __construct()
{
$this->esService = Client::setEs('goods_list');
$this->esService = Client::setEs($this->index_name);
}
@ -21,55 +21,24 @@ class GoodsEs
* @param $params
* @return
*/
public function list($params)
public function list($params = [],$page = 1, $limit = 10)
{
$page = 1;
$limit = 10;
// $body = [
// 'query' => [
// 'match_all' => []
// ],
// 'from' => ($page - 1) * $limit,
// 'size' => $limit,
// 'sort' => [
// 'id' => [
// 'order' => 'desc'
// ]
// ]
// ];
$data = $this->esService
return $this->esService
// ->setDebug()
->equal(['intro' => ''])
->from(1)
->size(10)
->order(['id' => 'desc'])
->like($params)
->from($page)
->size($limit)
->order(['goods_id' => 'desc'])
->query();
dd($data);
}
/**
* 更新商品
*/
public function update($goods_id)
public function updateData($goods_id, $data)
{
$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',
];
return $this->esService->update($goods_id, $doc);
return $this->esService->update($goods_id, $data);
}
/**
@ -77,32 +46,57 @@ class GoodsEs
*/
public function detail($goods_id)
{
$goods_id = 1;
$res = $this->esService->getDoc($goods_id);
var_dump($res);
return $this->esService->getDoc($goods_id);
}
/**
* 创建商品
*/
public function createData($goods_id, $goods_list)
{
$goods_list['create_time'] = $goods_list['create_time'] ? strtotime($goods_list['create_time']) * 1000 : time() * 1000;
$goods_list['update_time'] = $goods_list['update_time'] ? strtotime($goods_list['update_time']) * 1000 : time() * 1000;
$goods_list['delivery_type'] = implode(',', $goods_list['delivery_type']);
return $this->esService->addDoc($goods_id, $goods_list)->asArray();
}
/**
* 批量创建商品
* @return
*/
public function create($goods_id)
public function batchCreateData()
{
$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);
for ($page = 1; $page<=134; $page++)
{
$this->addData($page);
sleep(1);
}
}
public function addData($page)
{
$goods_list = \app\common\model\Goods::where('goods_id', '>', 368257)
// ->order('goods_id desc')
->page($page)
->limit(2000)
->select()
->toArray();
//
$i = 0;
foreach ($goods_list as $value)
{
$value['create_time'] = strtotime($value['create_time']) * 1000;
$value['update_time'] = strtotime($value['update_time']) * 1000;
$value['delivery_type'] = implode(',', $value['delivery_type']);
$res = $this->esService->addDoc($value['goods_id'], $value)->asArray();
if($res['result'] == 'created')
{
$i++;
}
}
echo('同步成功'.$i.'条数据').PHP_EOL;
}
/**
@ -110,8 +104,15 @@ class GoodsEs
*/
public function delete($goods_id)
{
$res = $this->esService->deleteDoc($goods_id);
var_dump($res);
return $this->esService->deleteDoc($goods_id);
}
/**
* 删除索引
*/
public function deleteIndex()
{
return $this->esService->deleteIndexNew();
}
@ -126,41 +127,255 @@ class GoodsEs
$mapping = [
'properties' => [
'goods_id' => [
'type' => 'integer'
'type' => 'keyword'
],
'goods_type' => [
'type' => 'keyword'
],
'director' => [
'goods_name' => [
'type' => 'text',
"analyzer" => "ik_smart"
],
'intro' => [
'goods_no' => [
'type' => 'keyword',
],
'video_id' => [
'type' => 'integer'
],
'brand_id' => [
'type' => 'integer'
],
'video_cover_id' => [
'type' => 'integer'
],
'selling_point' => [
'type' => 'text',
"analyzer" => "ik_smart"
],
'cover' => [
'spec_type' => [
'type' => 'integer'
],
'cost_price_min' => [
'type' => 'float'
],
'goods_price_min' => [
'type' => 'float'
],
'goods_price_max' => [
'type' => 'float'
],
'line_price_min' => [
'type' => 'float'
],
'line_price_max' => [
'type' => 'float'
],
'stock_total' => [
'type' => 'integer'
],
'deduct_stock_type' => [
'type' => 'integer'
],
'is_restrict' => [
'type' => 'integer'
],
'restrict_total' => [
'type' => 'integer'
],
'restrict_single' => [
'type' => 'integer'
],
'content' => [
'type' => 'text',
],
'sales_initial' => [
'type' => 'integer'
],
'delivery_id' => [
'type' => 'integer'
],
'is_points_gift' => [
'type' => 'integer'
],
'is_points_discount' => [
'type' => 'integer'
],
'is_alone_points_discount' => [
'type' => 'integer'
],
'points_discount_config' => [
'type' => 'text'
],
'is_enable_grade' => [
'type' => 'integer'
],
'is_alone_grade' => [
'type' => 'integer'
],
'alone_grade_equity' => [
'type' => 'text'
],
'is_ind_dealer' => [
'type' => 'integer'
],
'dealer_money_type' => [
'type' => 'integer'
],
'first_money' => [
'type' => 'float'
],
'second_money' => [
'type' => 'float'
],
'third_money' => [
'type' => 'float'
],
'is_ind_delivery_type' => [
'type' => 'integer'
],
'delivery_type' => [
'type' => 'keyword'
],
'status' => [
'type' => 'integer'
],
'sort' => [
'type' => 'integer'
],
'store_id' => [
'type' => 'keyword'
],
'merchant_id' => [
'type' => 'keyword'
],
'create_time' => [
'type' => 'date',
'format' => 'yyyy-MM-dd HH:mm:ss'
],
'update_time' => [
'type' => 'date',
'format' => 'yyyy-MM-dd HH:mm:ss'
],
'is_brand' => [
'type' => 'integer'
],
'is_new' => [
'type' => 'integer'
],
'paihang' => [
'type' => 'integer'
],
'remaizhishu' => [
'type' => 'integer'
],
'spu_id' => [
'type' => 'integer'
],
'channel' => [
'type' => 'keyword'
],
'unicode' => [
'type' => 'keyword'
],
'is_in_store' => [
'type' => 'integer'
],
'profit' => [
'type' => 'float'
],
'profit_rate' => [
'type' => 'float'
],
'cmmdty_model'=> [
'type' => 'keyword'
],
'remark' => [
'type' => 'text'
],
'sale_areas' => [
'type' => 'text'
],
'sale_areas_id' => [
'type' => 'keyword'
],
'episode_count' => [
'data_type' => [
'type' => 'integer'
],
'is_pool' => [
'type' => 'integer'
],
'is_self' => [
'type' => 'integer'
],
'link' => [
'type' => 'keyword'
],
'wechat_vid' => [
'origin_goods_id' => [
'type' => 'integer'
],
'link_other' => [
'type' => 'text'
],
'goods_no_other' => [
'type' => 'keyword'
],
'duration' => [
'region' => [
'type' => 'text'
],
'region_text' => [
'type' => 'text'
],
'specific_value' => [
'type' => 'keyword'
],
'service_types' => [
'cate_status' => [
'type' => 'integer'
],
'is_check' => [
'type' => 'integer'
],
'goods_source' => [
'type' => 'keyword'
],
'delivery_time' => [
'type' => 'integer'
],
'distribute_price' => [
'type' => 'float'
],
'shop_price' => [
'type' => 'float'
],
'is_has_banner' => [
'type' => 'integer'
],
'is_has_detail' => [
'type' => 'integer'
],
'is_jingpin' => [
'type' => 'integer'
],
'sale_time' => [
'type' => 'integer'
],
'markup_rate' => [
'type' => 'integer'
]
]
];
$res = $this->esService->createIndexNew($mapping);
var_dump($res);
return $this->esService->createIndexNew($mapping);
}
/**
* 设置分词字段
*/
public function analyze()
{
return $this->esService->analyze('goods_name');
}
}
Loading…
Cancel
Save