作者:佚名 时间:2024-10-08 09:26:09 阅读:(11)
Sphinx是一个高效的全文搜索引擎,专为处理大规模数据而设计。在进行复杂查询时,数据过滤是提升搜索结果相关性的重要手段。Sphinx提供了强大的过滤方法SetFilter(),允许开发者根据特定条件限制返回的结果集。通过使用该方法,用户可以轻松地排除不相关的数据,从而精确满足特定的查询需求。接下来云梦编程就为大家介绍一下Sphinx的SetFilter()方法,有需要的小伙伴可以参考一下:
mysql中,每一个文档都有多个标签,查询时可以筛选一个标签也可以筛选同时拥有多个标签的文档。
文档 标签 1 1,2,3,4,5 2 2,3,4,5,6 3 3,4,5,6,7 4 4,5,6,7,8 5 5,6,7,8,9
注意:
这里将文档id和标签tagid的对应关系存入了fy_content_tag表,一个id对应多条tagid记录
(1)、查出拥有标签2的文档
(2)、查出同时拥有标签2,3,4的文档
(1)、配置shpinx mva多值属性
编辑sphinx配置文件,给数据源增加一个多值属性
sql_attr_multi = uint tagid from query;\ SELECT id,tagid FROM fy_content_tag
(2)、执行查询
(1)、查出拥有标签2的文档
$sphinx->setFilter('tagid', array(2));
(2)、查出同时拥有标签2,3,4的文档
$sphinx->setFilter('tagid', array(2)); $sphinx->setFilter('tagid', array(3)); $sphinx->setFilter('tagid', array(4));
这里解释一下:
$sphinx->setFilter(‘tagid’, array(2,3,4)); 是表示含有标签值2,3,4中的任意一个即符合筛选,这里是or关系。 $sphinx->setFilter(‘tagid’, array(2)); $sphinx->setFilter(‘tagid’, array(3)); $sphinx->setFilter(‘tagid’, array(4));
设置三个filter是标示,要同时满足2,3,4三个属性值才符合,这里是and关系。
在Sphinx中,有一个MVA属性,声明格式如下(用反斜线只是为了清晰,您仍可以在一行之内完成声明):
sql_attr_multi = ATTR-TYPE ATTR-NAME ‘from’ SOURCE-TYPE \ [;QUERY] \ [;RANGE-QUERY]
其中
ATTR-TYPE 是 ‘uint’ 或 ‘timestamp’之一
SOURCE-TYPE 是 ‘field’, ‘query’, 或 ‘ranged-query’之一
QUERY 是用来取得全部(文档 ID,属性值)序对的 SQL 查询
RANGE-QUERY 是用来取得文档 ID 的最小值与最大值的 SQL 查询,
与’sql_query_range’类似
示例:
sql_attr_multi = uint tag from field; sql_attr_multi = uint tag from query; SELECT id, tag FROM tags sql_attr_multi = uint tag from ranged-query; \ SELECT id, tag FROM tags WHERE id>=$start AND id<=$end; \ SELECT MIN(id), MAX(id) FROM tags
使用field类型时,field字段的值应该是以英文逗号隔开的多个无符号32位整数,如:1,2,3,4
使用query或者ranged-query时,每行一个值,一个id对应多个(多行)tag值