# 搜索过滤

# 过滤介绍

搜索过滤适用于 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, //第几页

    ]

];

注意,对于 innotin,只支持年月日字符串

# 字符串匹配过滤

// 搜索单个字段
$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'];