// 查询文档 (分页,排序,权重,过滤)
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];
}