# 搜索过滤
# 过滤介绍
搜索过滤适用于 match、multi_match、match_bool
//搜索过滤适用于 match multi_match match_bool
// filter关键词与field同级 以下为代码示例
//实例化引擎
$Wind = new \WindSearch\Index\Wind($indexName);
//开启分词功能
$Wind->loadAnalyzer();
//开始搜索
// 搜索单个字段
$query = [
'match' => [
'field' => [
// 此处为搜索字段信息...
],
//筛选过滤
'filter' => [
'conditions' => [
// 过滤条件...
],
],
// 结果排序 为空时,自动按命中个数倒排
// ...
// 分页
// ...
]
];
// 搜索接口
$res = $Wind->search($query, $page, $listRows);
// 返回的最终结果,可直接渲染到前台页面
$resArr = $res['result'];
过滤类型
数值过滤:
gt(大于) lt (小于)gte(大于等于) lte(小于等于),一个过滤项最多只能包含两个数值过滤条件
eq(等于某个值) in(数组,值存在于此数组集合)
地理空间过滤:
范围过滤 gt(大于) lt(小于)、周边过滤 lt(小于),单位包括km(公里、千米),m(米)
字符串匹配:
match,包括完全匹配、前缀匹配
例如:完全匹配:中国 前缀匹配:中*
要对某个字段进行“字符串匹配”,此字段必须为keyword、text类型,且配置索引
# 地理距离过滤
// 搜索单个字段
$query = [
'match' => [
'field' => [
// 此处为搜索字段信息...
],
//筛选过滤
'filter' => [
//筛选条件
'conditions' => [
// 地理位置过滤
//示例的含义:location为geo_point数据类型,搜索结果的距离限制为,以设置的经纬点为中心,大于5km,小于15km内的内容
'location' => [
// 中心经纬度,支持字符串、数组
// 字符串:纬度,经度 数组:[纬度,经度]
// '30.621900130545825,114.28891807367313'
'geo_point' => [
'lat' => '30.621900130545825', //纬度
'lon' => '114.28891807367313', //经度
],
'distance' => '8000m', // 8公里范围内
// 'distance' => ['1km', '10km'], // 1公里到10公里范围内
],
],
],
// 结果排序 为空时,自动按命中个数倒排
'sort' => [
'time' => 'desc' //asc 按字段值正序 desc 按字段值倒序
],
'list_rows' => $listRows, //每页多少条数据
'page' => $page, //第几页
]
];
# 数值过滤
// 搜索单个字段
$query = [
'match' => [
'field' => [
// 此处为搜索字段信息...
],
//筛选过滤
'filter' => [
'conditions' => [
// 顺序部不分先后
'score' => [
// 所有条件不分先后
// 等于 小于
'gte' => 20,
'lt' => 40,
// 等于
// 'eq' => 25,
// 不等于
// 'noteq'=>15,
// 存在于
// 'in'=>[13,25],
// 不存在于
// 'notin'=>[13,25],
],
// 主键过滤
'uid'=>[
'in'=>[
'2E1ED673-5F06-A398-C556-10C35CFAAA10',
//...
],
'notin'=>[
'2E1ED673-5F06-A398-C556-10C35CFAAA10',
//...
],
],
'time' => [
// 支持时间戳、字符串
'gte' => '2024-03-10',
'lt' => '2024-03-15',
],
],
],
// 结果排序 为空时,自动按命中个数倒排
'sort' => [
'time' => 'desc' //asc 按字段值正序 desc 按字段值倒序
],
'list_rows' => $listRows, //每页多少条数据
'page' => $page, //第几页
]
];
# 主键过滤
// 搜索单个字段
$query = [
'match' => [
'field' => [
// 此处为搜索字段信息...
],
//筛选过滤
'filter' => [
'conditions' => [
// 主键过滤
'uid'=>[
'in'=>[
'2E1ED673-5F06-A398-C556-10C35CFAAA10',
//...
],
'notin'=>[
'2E1ED673-5F06-A398-C556-10C35CFAAA10',
//...
],
],
],
],
// 结果排序 为空时,自动按命中个数倒排
'sort' => [
'time' => 'desc' //asc 按字段值正序 desc 按字段值倒序
],
'list_rows' => $listRows, //每页多少条数据
'page' => $page, //第几页
]
];
# 日期过滤
// 搜索单个字段
$query = [
'match' => [
'field' => [
// 此处为搜索字段信息...
],
//筛选过滤
'filter' => [
'conditions' => [
'time' => [
// 支持时间戳、字符串
'gte' => '2024-03-10',
'lt' => '2024-03-15',
// 'in' =>['2023-05-16','2023-05-17'],
// 'notin' =>['2023-05-16','2023-05-17'],
],
],
],
// 结果排序 为空时,自动按命中个数倒排
'sort' => [
'time' => 'desc' //asc 按字段值正序 desc 按字段值倒序
],
'list_rows' => $listRows, //每页多少条数据
'page' => $page, //第几页
]
];
注意,对于 in
、notin
,只支持年月日字符串。
# 字符串匹配过滤
// 搜索单个字段
$query = [
'match' => [
'field' => [
// 此处为搜索字段信息...
],
//筛选过滤
'filter' => [
'conditions' => [
//地区
'area'=>[
// 字符串匹配 限制keyword,text字段
// 完全匹配、前缀匹配、后缀匹配
// 支持字符串、数组
// 'eq' =>'中国',
// 'eq' =>['中国','澳大利亚'],
// 完全匹配跟前缀、后缀匹配,可混合设置
'eq' => ['中国','澳大*','*坡']
]
],
],
// 结果排序 为空时,自动按命中个数倒排
'sort' => [
'time' => 'desc' //asc 按字段值正序 desc 按字段值倒序
],
'list_rows' => $listRows, //每页多少条数据
'page' => $page, //第几页
]
];
# 多个过滤条件
// 搜索单个字段
$query = [
'match' => [
'field' => [
// 此处为搜索字段信息...
],
//筛选过滤
'filter' => [
'conditions' => [
//地理位置过滤
'location' => [
// 中心经纬度,支持字符串、数组
// 字符串:纬度,经度 数组:[纬度,经度]
// '30.621900130545825,114.28891807367313'
'geo_point' => [
'lat' => '30.621900130545825', //纬度
'lon' => '114.28891807367313', //经度
],
'distance' => '8000m', // 8公里范围内
// 'distance' => ['1km', '10km'], // 1公里到10公里范围内
],
// 数值过滤
'score' => [
// 所有条件不分先后
// 等于 小于
'gte' => 20,
'lt' => 40,
// 等于
// 'eq' => 25,
// 不等于
// 'noteq'=>15,
// 存在于
// 'in'=>[13,25],
// 不存在于
// 'notin'=>[13,25],
],
// 主键过滤
'uid'=>[
'in'=>[
'2E1ED673-5F06-A398-C556-10C35CFAAA10',
//...
],
'notin'=>[
'2E1ED673-5F06-A398-C556-10C35CFAAA10',
//...
],
],
// 时间过滤
'time' => [
// 支持时间戳、字符串
'gte' => '2024-03-10',
'lt' => '2024-03-15',
// 'in' =>['2023-05-16','2023-05-17'],
// 'notin' =>['2023-05-16','2023-05-17'],
],
//字符串过滤
'area'=>[
// 字符串匹配 限制keyword,text字段
// 完全匹配、前缀匹配、后缀匹配
// 支持字符串、数组
// 'eq' =>'中国',
// 'eq' =>['中国','澳大利亚'],
// 完全匹配跟前缀、后缀匹配,可混合设置
'eq' => ['中国','澳大*','*坡']
]
],
],
// 结果排序 为空时,自动按命中个数倒排
'sort' => [
'time' => 'desc' //asc 按字段值正序 desc 按字段值倒序
],
'list_rows' => $listRows, //每页多少条数据
'page' => $page, //第几页
]
];
// 搜索接口
$res = $Wind->search($query, $page, $listRows);
// 返回的最终结果,可直接渲染到前台页面
$resArr = $res['result'];