首页 > Web开发 > 详细

PHP:Laravel 构建一个elasticsearch查询

时间:2021-02-24 15:23:35      阅读:24      评论:0      收藏:0      [点我收藏+]

ES可以用作数据库,但是不建议当数据库,所以一般只用来存储关键数据。查出ID之后再去数据库查询。

public function index(Request $request)
    {
      $page = $request->input(‘page‘,1);
      $size = 20;

      //构建es查询
      $params = [
        "index" => "products",
        "body" => [
          "from" => ($page - 1) * $size,
          "size" => $size,
          "query" => [
            "bool" => [
              "filter" => [
                [
                  "term" => [
                  "status" => true
                ],
                "term" => [
                  "audit_status" => 1
                ]
                ],
              ],
            ],
          ],
        ],
      ];
      // 是否有提交排序参数
      if ($order = $request->input(‘order‘, ‘‘)) {
          // 是否是以 _asc 或者 _desc 结尾
          if (preg_match(‘/^(.+)_(asc|desc)$/‘, $order, $m)) {
              // 如果字符串的开头是这 3 个字符串之一,说明是一个合法的排序值
              if (in_array($m[1], [‘price‘, ‘sold_count‘, ‘rating‘])) {
                  // 根据传入的排序值来构造排序参数
                  $params[‘body‘][‘sort‘] = [[$m[1] => $m[2]]];
              }
          }
      }

      $result = app(‘es‘)->search($params);

      // 通过 collect 函数将返回结果转为集合,并通过集合的 pluck 方法取到返回的商品 ID 数组
      $productIds = collect($result[‘hits‘][‘hits‘])->pluck(‘_id‘)->all();
      // 通过 whereIn 方法从数据库中读取商品数据
      $products = Product::query()
          ->whereIn(‘id‘, $productIds)
          // orderByRaw 可以让我们用原生的 SQL 来给查询结果排序
          ->orderByRaw(sprintf("FIND_IN_SET(id, ‘%s‘)", join(‘,‘, $productIds)))
          ->get();
      // 返回一个 LengthAwarePaginator 对象
      $pager = new LengthAwarePaginator($products, $result[‘hits‘][‘total‘][‘value‘], $perPage, $page, [
          ‘path‘ => route(‘products.index‘, false), // 手动构建分页的 url
      ]);
      return view(‘products.index‘, [
          ‘products‘ => $pager,
          ‘filters‘  => [
              ‘search‘ => ‘‘,
              ‘order‘  => $order,
          ]
      ]);
    }

 

PHP:Laravel 构建一个elasticsearch查询

原文:https://www.cnblogs.com/wish-yang/p/14441193.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!