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

    }

  

posted on 2021-04-20 09:25  超灬超  阅读(186)  评论(0编辑  收藏  举报