es 查询 问题 模糊查询

当你搜索 宝马  bmw 等词可以通过 词典 ,相近词 进行 匹配 (包括 ik 等 分词器) 来解决,当我搜索 com.  或者 cn.  等类型包名的关键词 却匹配不出。不大会说,直接上代码

第一个简单
ik_syno (cname ename host)分词


        $curl_param = [
            'size'=>$size,
            'query'=>[
                'bool'=>[
                    'must'=>[
                        'multi_match'=>[
                            'query'=>$param,
                            'fields'=>[
                                'host','cname^10','ename'
                            ],
                            'tie_breaker'=>0.3
                        ]
                    ]
                ]
                
            ]
        ];

        if($is_en_dian)$curl_param = $curl_param_dian;

        // 接下来 搜索 请求
        结果 com. cn. 等搜不到内容

第二个阶段
        


        if(empty($is_en_dian))
        {
            // 暂时解决 app 域名 搜索
            $app_domain = [
                'com.','cn.','tv.','ctrip.','yong.','jp.'
            ];
            foreach ($app_domain as $key => $value) {
                if(stripos($param,$value)===0)
                {
                    $is_en_dian = 1;
                    break;
                }
            }
        }
        
        $curl_param = [
            'size'=>$size,
            'query'=>[
                'bool'=>[
                    'must'=>[
                        'multi_match'=>[
                            'query'=>$param,
                            'fields'=>[
                                'host','cname^10','ename'
                            ],
                            'tie_breaker'=>0.3
                        ]
                    ]
                ]
                
            ]
        ];

        $curl_param_dian = [
            'size'=>$size,
            'query'=>[
                'bool'=>[
                    'must'=>[
                        [
                            'prefix'=>[
                                'host'=>$param
                            ]
                        ]
                    ]
                ]
                
            ]
        ];


        if($is_en_dian)$curl_param = $curl_param_dian;

        // 接下来 搜索 请求
        // 暂时解决 com. cn. 的问题

接下来 在想能不能一次搞定特殊词的搜索

第三个阶段 

这时候 mapping 配置有所改变

ik_syno(cname ename) 和 english(host) 分词

$curl_param = [
            'size'=>$size,
            'query'=>[
                'bool'=>[
                    'should'=>[
                        [
                            'match'=>[
                                'cname'=>[
                                    'query'=>$param,
                                    'boost'=>10
                                ]
                            ]
                        ],
                        [
                            'match_phrase_prefix'=>[
                                'host'=>$param
                            ]
                        ]
                    ]
                ]
                
            ]
        ];

通过 match_phrase_prefix  可以实现 。但是 必须 should (现有逻辑业务和数据)
基于 sql 插件 可以实现 类似 mysql like  模糊查询 直接 运行 select * from xxx where cname like '%com.%' or ename like '%com.%' or host like '%com.%'

至于有没有更好的方案,进一步思考中。。。。


你可能感兴趣的:(elasticsearch)