云梦编程网

当前位置:首页 > Liunx教程 >

sphinx过滤方法setFilter()

作者:佚名 时间:2024-10-08 09:26:09 阅读:(11)

Sphinx是一个高效的全文搜索引擎,专为处理大规模数据而设计。在进行复杂查询时,数据过滤是提升搜索结果相关性的重要手段。Sphinx提供了强大的过滤方法SetFilter(),允许开发者根据特定条件限制返回的结果集。通过使用该方法,用户可以轻松地排除不相关的数据,从而精确满足特定的查询需求。接下来云梦编程就为大家介绍一下Sphinx的SetFilter()方法,有需要的小伙伴可以参考一下:

sphinx过滤方法setFilter()

1、需求描述

mysql中,每一个文档都有多个标签,查询时可以筛选一个标签也可以筛选同时拥有多个标签的文档。

2、数据示例

文档         标签
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记录

3、查询要求

    (1)、查出拥有标签2的文档
    (2)、查出同时拥有标签2,3,4的文档

4、使用sphinx解决需求

    (1)、配置shpinx mva多值属性

    编辑sphinx配置文件,给数据源增加一个多值属性

sql_attr_multi = uint tagid from query;\
       SELECT id,tagid FROM fy_content_tag

    (2)、执行查询

5、使用API中的setFilter即可。

    (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关系。

6、Sphinx sql_attr_multi配置参考

在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值


最新文章

热门文章