封装Es商品搜索

es
ztt 8 months ago
parent 131ca35f3a
commit ddb8634042
  1. 2
      app/command/SyncGoodsToEs.php
  2. 26
      app/common/library/elasticsearch/Client.php
  3. 359
      app/common/service/GoodsEs.php

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

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

@ -8,11 +8,11 @@ class GoodsEs
{ {
private Client $esService; private Client $esService;
private $index_name = 'goods_list'; private string $index_name = 'goods_list';
public function __construct() public function __construct()
{ {
$this->esService = Client::setEs('goods_list'); $this->esService = Client::setEs($this->index_name);
} }
@ -21,55 +21,24 @@ class GoodsEs
* @param $params * @param $params
* @return * @return
*/ */
public function list($params) public function list($params = [],$page = 1, $limit = 10)
{ {
$page = 1; return $this->esService
$limit = 10;
// $body = [
// 'query' => [
// 'match_all' => []
// ],
// 'from' => ($page - 1) * $limit,
// 'size' => $limit,
// 'sort' => [
// 'id' => [
// 'order' => 'desc'
// ]
// ]
// ];
$data = $this->esService
// ->setDebug() // ->setDebug()
->equal(['intro' => '']) ->like($params)
->from(1) ->from($page)
->size(10) ->size($limit)
->order(['id' => 'desc']) ->order(['goods_id' => 'desc'])
->query(); ->query();
dd($data);
} }
/** /**
* 更新商品 * 更新商品
*/ */
public function update($goods_id) public function update($goods_id, $data)
{ {
$goods_id = 1; return $this->esService->update($goods_id, $data);
$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);
} }
/** /**
@ -77,32 +46,57 @@ class GoodsEs
*/ */
public function detail($goods_id) public function detail($goods_id)
{ {
$goods_id = 1; return $this->esService->getDoc($goods_id);
$res = $this->esService->getDoc($goods_id);
var_dump($res);
} }
/** /**
* 创建商品 * 创建商品
*/
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 * @return
*/ */
public function create($goods_id) public function batchCreateData()
{ {
$goods_id = 1; for ($page = 1; $page<=134; $page++)
$doc = [ {
'id' => $goods_id, $this->addData($page);
'video_title' => '少爷的甜蜜良药', sleep(1);
'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', public function addData($page)
'wechat_vid' => 'wx_vid_1', {
'duration' => '01:02:03', $goods_list = \app\common\model\Goods::where('goods_id', '>', 368257)
'service_types' => '2,3', // ->order('goods_id desc')
]; ->page($page)
$res = $this->esService->addDoc($goods_id, $doc); ->limit(2000)
var_dump($res); ->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) public function delete($goods_id)
{ {
$res = $this->esService->deleteDoc($goods_id); return $this->esService->deleteDoc($goods_id);
var_dump($res); }
/**
* 删除索引
*/
public function deleteIndex()
{
return $this->esService->deleteIndexNew();
} }
@ -126,41 +127,255 @@ class GoodsEs
$mapping = [ $mapping = [
'properties' => [ 'properties' => [
'goods_id' => [ 'goods_id' => [
'type' => 'integer' 'type' => 'keyword'
], ],
'goods_type' => [ 'goods_type' => [
'type' => 'keyword' 'type' => 'keyword'
], ],
'director' => [ 'goods_name' => [
'type' => 'text', 'type' => 'text',
"analyzer" => "ik_smart" "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', 'type' => 'text',
"analyzer" => "ik_smart" "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' 'type' => 'keyword'
], ],
'episode_count' => [ 'data_type' => [
'type' => 'integer'
],
'is_pool' => [
'type' => 'integer'
],
'is_self' => [
'type' => 'integer'
],
'link' => [
'type' => 'keyword' 'type' => 'keyword'
], ],
'wechat_vid' => [ 'origin_goods_id' => [
'type' => 'integer'
],
'link_other' => [
'type' => 'text'
],
'goods_no_other' => [
'type' => 'keyword' 'type' => 'keyword'
], ],
'duration' => [ 'region' => [
'type' => 'text'
],
'region_text' => [
'type' => 'text'
],
'specific_value' => [
'type' => 'keyword' 'type' => 'keyword'
], ],
'service_types' => [ 'cate_status' => [
'type' => 'integer'
],
'is_check' => [
'type' => 'integer'
],
'goods_source' => [
'type' => 'keyword' '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); return $this->esService->createIndexNew($mapping);
var_dump($res);
} }
/**
* 设置分词字段
*/
public function analyze()
{
return $this->esService->analyze('goods_name');
}
} }
Loading…
Cancel
Save