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

sphinx过滤方法setFilter()

发布时间:2020-03-20 21:24:41 作者:佚名 阅读:(61)

    最近网站使用了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值

   

欢迎分享转载→ sphinx过滤方法setFilter()

© 2015-2019 - 吾爱编程网 版权所有 苏ICP备18033726号-1关于我们 - 网站声明 - 联系我们