Example #1
0
 /**
  * 搜索服务
  * @param string|array  $query, 'field1:>0 AND field2:xxxx' or ['field'=>[tag1,tag2,tag3]],如果是数组则支持某个字段上的模糊查询
  * @param int           $page ,当前页码
  * @param int           $pagesize ,每页数量
  * @param string        $sort,排序,规则 'field:desc',默认 按内置_t降序
  * @return type
  * @throws \mysoft\log\Exception
  */
 public function search($query = '', $page = 1, $pagesize = 10, $sort = '_t:desc')
 {
     try {
         $search = [];
         $search['index'] = $this->index;
         $search['type'] = $this->type;
         if ($sort) {
             $search['sort'] = $sort;
         }
         if ($query) {
             if (is_array($query)) {
                 $must = [];
                 foreach ($query as $key => $val) {
                     //区间值匹配
                     if (isset($query[$key]['range'])) {
                         $keys = array_keys($val['range']);
                         foreach ($keys as $k) {
                             if (!in_array($k, ['lt', 'gt', 'from', 'to'])) {
                                 throw new \Exception('关键字rang有问题,请使用gt,lt,from,to');
                             }
                         }
                         $must[]['range'][$key] = $val['range'];
                     }
                     //单个字段的模糊查询
                     if (isset($query[$key]['like'])) {
                         if (!is_array($val['like'])) {
                             throw new \Exception('关键字like的值请输入数组');
                         }
                         $val['like'] = implode(' ', $val['like']);
                         $must[]['match'][$key] = ['query' => $val['like'], 'operator' => 'AND'];
                     }
                     //单个字段精确匹配
                     if (isset($query[$key]['eq'])) {
                         $must[]['match_phrase'][$key] = $val['eq'];
                     }
                 }
                 //                   echo '<pre>'; print_r($must);die;
                 if ($must) {
                     $search['body']['query']['bool']['must'] = $must;
                 }
             } else {
                 //普通的查询
                 $search['body']['query']['query_string']['query'] = $query;
             }
         }
         $search['size'] = $pagesize > 0 ? $pagesize : 10;
         $search['from'] = ($page > 0 ? $page - 1 : 1) * $search['size'];
         $res = $this->client->search($search);
         return $this->client->_format($res);
     } catch (\Exception $ex) {
         throw $ex;
     }
 }