【ElasticSearch】对于在laravle中搜索的优化
【摘要】
优化在laravel中使用ElasticSearch的代码
在App\Support目录下创建一个GoodsEsBuilder的类,这个类就用于对es商品搜索的查询条件的生成器 因为参数的格式基本一致...
优化在laravel中使用ElasticSearch的代码
在App\Support目录下创建一个GoodsEsBuilder的类,这个类就用于对es商品搜索的查询条件的生成器
因为参数的格式基本一致,所以我们可以定义如下格式
然后提供如下图中的几个方法
分别对于是category根据商品分类查询,getParams获取查询格式,keywords根据关键词查询,orderby排序,paginate 分页,sale是否上架
// 添加分页查询
public function paginate($size, $page)
{
$this->params['body']['from'] = ($page - 1) * $size;
$this->params['body']['size'] = $size;
return $this;
}
// 筛选上架状态的商品
public function sale()
{
$this->params['body']['query']['bool']['filter'][] = ['term' => ['sale' => 1]];
// ['term' => ['sale' => 1]],
return $this;
}
// 按类目筛选商品
public function category(GoodsCategory $category)
{
if ($category->level != 2) {
$this->params['body']['query']['bool']['filter'][] = [
'prefix' => ['category_path' => $category->possess.$category->id.'-'],
];
} else {
$this->params['body']['query']['bool']['filter'][] = ['term' => ['category_id' => $category->id]];
}
}
// 添加搜索词
public function keywords($keywords)
{
// 如果参数不是数组则转为数组
$keywords = is_array($keywords) ? $keywords : [$keywords];
foreach ($keywords as $keyword) {
$this->params['body']['query']['bool']['must'][] = [
'multi_match' => [
'query' => $keyword,
'fields' => [
'title^3',
'long_title^2',
'category^2', // 类目名称
'desc',
'skus_attr_name',
],
],
];
}
return $this;
}
// 添加排序
public function orderBy($field, $direction)
{
if (!isset($this->params['body']['sort'])) {
$this->params['body']['sort'] = [];
}
$this->params['body']['sort'][] = [$field => $direction];
return $this;
}
// 返回构造好的查询参数
public function getParams()
{
return $this->params;
}
如上代码
修改控制器:
$page = $request->input('page', 1);
$perPage = 6;
// 新建查询构造器对象,设置只搜索上架商品,设置分页
$builder = (new GoodsEsBuilder())->sale()->paginate($perPage, $page);
if ($request->input('category_id') && $category = GoodsCategory::find($request->input('category_id'))) {
// 调用查询构造器的类目筛选
$builder->category($category);
}
if ($search = $request->input('search', '')) {
$keywords = array_filter(explode(' ', $search));
// 调用查询构造器的关键词筛选
$builder->keywords($keywords);
}
$builder->orderBy('pv', 'desc');
// 最后通过 getParams() 方法取回构造好的查询参数
return app('es')->search($builder->getParams());
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
文章来源: blog.csdn.net,作者:咔咔-,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/fangkang7/article/details/96881895
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)