/** * 搜索服务 * @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; } }