本文介绍使用Elasticsearch进行查询的语句和代码。
查询界面如下:
知识点:
- must 文档必须匹配 must 选项下的查询条件,相当于逻辑运算的 AND,且参与文档相关度的评分。
- should 文档可以匹配 should 选项下的查询条件也可以不匹配,相当于逻辑运算的 OR,且参与文档相关度的评分。
- must_not 与 must 相反,匹配该选项下的查询条件的文档不会被返回;需要注意的是,must_not 语句不会影响评分,它的作用只是将不相关的文档排除。
- filter 和 must 一样,匹配 filter 选项下的查询条件的文档才会被返回,但是 filter 不评分,只起到过滤功能,与 must_not 相反。
一 直接查询
对于ID,只有一条数据,直接查询数据库,使用聚簇索引,结果及时精确。
二 精确匹配
对于会员ID,类型为integer,使用filter过滤,term表示完全匹配,直接通过倒排索引对搜索词进行查找
"query"{
"bool":{
"filter":[{
"term":{
"ctmid":"117303"
}
}]
}
},
$aSearchParams['query']['bool']['filter'][] = ['term' => ['ctmid' => '117303']];
注意:这里的ctmid是整型,不会被分词。
三 模糊匹配
对于Email,类型为text,使用match模糊匹配,先进行分词解析,然后匹配查找
"query":{
"bool":{
"filter":[
{"match":{"jobemail":"apple@51job.com"}}
]
}
},
$aSearchParams['query']['bool']['filter'][] = ['match' => ['email' => 'apple@51job.com']];
四 前缀匹配
输入职位名联想,使用prefix前缀查询,返回用aggs进行分组统计
"query":{
"prefix":{
"jobname":"i"
}
},
"size":"0",
"aggs":{"group_by_key":{"terms":{"field":"jobname","include":"i.*"}}}}
$aSearchParams['query']['prefix'] = ['jobname' => 'i'];
$aSearchParams['aggs']['group_by_key']['terms'] = ['field' => 'jobname','include' => 'i.*'];
五 完整匹配
对于职位名字段,类型为text,比如输入“开发工程师”,需要输出所有包含“开发工程师”的职位,但是不允许“开发XX工程师”。
选择使用match_phrase,首先把内容分词,分词器可以自定义,同时文档还要满足以下两个条件:
- 分词后所有词项都要出现在该字段中(相当于 and 操作)。
- 字段中的词项顺序要一致。
{
"must": {
"bool": {
"should": [{
"match_phrase": {
"jobname": {
"query":"开发工程师",
"slop":"0", //允许间隔
"zero_terms_query":"NONE", //不匹配
}
}
}],
"minimum_should_match":"1", //最低匹配度
"boost":1 //权重
}
}
}
$aSearch = ['match_phrase'=>
['jobname'=>[
'query'=>'开发工程师',
'slop'=>'0',
'zero_terms_query'=>'NONE',
]
]];
$aESParams['bool']['should'][] = $aSearch;
$aESParams['bool']['minimum_should_match'] = '1';
$aESParams['bool']['boost'] = 1.0;
$aSearchParams['query']['bool']['must'] = $aESParams;
六 范围匹配
对于date这样日期类型的字段,通常需要范围查询,使用 gt > gte >= 和 lt < lte <= 标识上下限。
"query":
{"bool":
{"filter":
[{"term":
{"range":{"date":{"gte":"2021-09-30","lt":"2022-10-01"}}}]}},
foreach ($p_aParams['date'] as $key => $value)
{
switch($key)
{
case '1':
$aDate = ['gt'=>$value];
break;
case '2':
$aDate = ['lt'=>$value];
break;
}
}
$aSearchParams['query']['bool']['filter'][] = ['range' => [trim($key) => $sRange]];