当你搜索 宝马 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.%'
至于有没有更好的方案,进一步思考中。。。。