// 查询文档 (分页,排序,权重,过滤) public function search_doc($keywords = "", $profession_arr = ‘‘, $city_arr = [], $province_arr = [], $country_arr = [], $continent_arr = [], $month_arr = [], $type_arr = [], $year = 0, $hall = 0, $from = 0, $size = 6, $order = [‘_score‘ => [‘order‘ => ‘desc‘]] ) { $arr = 0; $must_arr = []; $filter_arr = []; $should_filter = []; $keys = ‘‘; if ($keywords) { /*获取单词的分词情况*/ $analyzer = $this->client->indices()->analyze( [ ‘index‘ => $this->index, ‘body‘ => [ ‘text‘ => $keywords, ‘analyzer‘ => ‘ik_smart‘ ] ] ); if ($analyzer) { $tokens = $analyzer[‘tokens‘]; $keys = array_column($tokens, ‘token‘, NULL); $keys_OR = implode(‘AND‘, $keys); $must_arr[][‘query_string‘] = [‘fields‘ => [‘name‘, ‘e_name‘], ‘query‘ => $keys_OR]; } } if ($year) { $must_arr[][‘term‘][‘year‘] = $year; } if ($hall) { $must_arr[][‘term‘][‘hall‘] = $hall; } //查询审核通过的数据 $must_arr[][‘term‘][‘checked‘] = 1; //按照给定年份 或者年份范围查询 /* if ($year && $year_arr[0] > 0) { $filter_arr[][‘range‘] = [‘create_date‘ => [‘gte‘ => $year_arr[0] . "-01-01", ‘lte‘ => $year_arr[1] . "-12-31"]]; }*/ if ($profession_arr) { if (!is_array($profession_arr) && $profession_arr !== 0) { $profession_arr = explode(‘,‘, $profession_arr); } //按照给定行业 if ($profession_arr !== 0 && ($profession_arr[0] ?? 0) !== 0 && count($profession_arr) > 0) { $arr = 1; $should_filter[][‘terms‘][‘profession‘] = $profession_arr; $should_filter[][‘terms‘][‘sub_profession‘] = $profession_arr; } } if ($province_arr) { if (!is_array($province_arr) && $province_arr !== 0) { $province_arr = explode(‘,‘, $province_arr); } //按照给定省份查询 if ($province_arr !== 0 && ($province_arr[0] ?? 0) !== 0 && count($province_arr) > 0) { foreach ($province_arr as $key => &$province) { if ($province == "北京" || $province == "天津" || $province == "上海" || $province == "重庆") { $province .= "市"; } else if ($province == "港澳台") { $province_arr = [‘香港特别行政区‘, ‘澳门特别行政区‘, ‘台湾省‘]; unset($province_arr[$key]); } else if ($province == ‘广西‘) { $province = ‘广西壮族自治区‘; } else if ($province == ‘内蒙古‘) { $province = ‘内蒙古自治区‘; } else if ($province == ‘宁夏‘) { $province = ‘宁夏回族自治区‘; } else if ($province == ‘新疆‘) { $province = ‘新疆维吾尔自治区‘; } else if ($province == ‘西藏‘) { $province = ‘西藏自治区‘; } else { $province .= "省"; } } $arr = 1; $filter_arr[][‘terms‘][‘province.keyword‘] = $province_arr; } } if ($city_arr) { if (!is_array($city_arr) && $city_arr !== 0) { $city_arr = explode(‘,‘, $city_arr); } //按照给定城市 if ($city_arr !== 0 && ($city_arr[0] ?? 0) !== 0 && count($city_arr) > 0) { $arr = 1; foreach ($city_arr as &$pc) { $pc .= "市"; } $filter_arr[][‘terms‘][‘city.keyword‘] = $city_arr; } } if ($country_arr) { if (!is_array($country_arr) && $country_arr !== 0) { $country_arr = explode(‘,‘, $country_arr); } //按照给定城市 if ($country_arr !== 0 && ($country_arr[0] ?? 0) !== 0 && count($country_arr) > 0) { $arr = 1; $filter_arr[][‘terms‘][‘country.keyword‘] = $country_arr; } } if ($continent_arr) { if (!is_array($continent_arr) && $continent_arr !== 0) { $continent_arr = explode(‘,‘, $continent_arr); } //按照给定城市 if ($continent_arr !== 0 && ($continent_arr[0] ?? 0) !== 0 && count($continent_arr) > 0) { $arr = 1; $filter_arr[][‘terms‘][‘continent.keyword‘] = $continent_arr; } } if ($month_arr) { if (!is_array($month_arr) && $month_arr !== 0) { $month_arr = explode(‘,‘, $month_arr); } //按照给定城市 if ($month_arr !== 0 && ($month_arr[0] ?? 0) !== 0 && count($month_arr) > 0) { $arr = 1; $filter_arr[][‘terms‘][‘month‘] = $month_arr; } } if ($type_arr) { if (!is_array($type_arr) && $type_arr !== 0) { $type_arr = explode(‘,‘, $type_arr); } //按照给定城市 if ($type_arr !== 0 && ($type_arr[0] ?? 0) !== 0 && count($type_arr) > 0) { $arr = 1; $must_arr[][‘terms‘][‘type‘] = $type_arr; } } if ($keywords || $year || $hall || $arr) { $params = [ ‘index‘ => $this->index, ‘body‘ => [ ‘query‘ => [ ‘bool‘ => // ‘constant_score‘ => [ ‘must‘ => $must_arr, ‘filter‘ => $filter_arr, ‘should‘=>$should_filter, // ‘minimum_should_match‘=>1 ] ], ‘sort‘ => [$order], ‘from‘ => $from, ‘size‘ => $size ] ]; //存在OR查询时 必须满足一个should if(count($should_filter) > 0){ $params[‘body‘][‘query‘][‘bool‘][‘minimum_should_match‘] = 1; } } else { $params = [ ‘index‘ => $this->index, ‘body‘ => [ ‘sort‘ => [$order] , ‘from‘ => $from, ‘size‘ => $size ] ]; } try { $re = $this->client->search($params); } catch (\Exception $e) { echo ‘<pre>‘; print_r($params); print_r($e->getMessage()); exit(); } /*echo "<pre>"; print_r($params); exit();*/ return [‘re‘ => $re, ‘keys‘ => $keys]; }
elastic-php should匹配设置至少匹配一个条件
原文:https://www.cnblogs.com/Ychao/p/14679636.html