需求描述

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的文档

使用sphinx解决需求

1、配置shpinx mva多值属性

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

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

2、执行查询

使用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关系。

————————————

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 MVA(声明多值属性)的用法
最近开始学习Sphinx,于是安装了“Coreseek 全文检索服务器 2.0“,详情可访问Coreseek官网,乔老大真的很热心,有问题可以POST在BBS,也可以加他的MSN,他都会耐心的为你解答,真是难得的好人。
  回到主题,在Mysql数据库中,有SET(集合)类型,可以保存多个值,使用FIND_IN_SET函数查找也很方便。在使用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
使用第一种还是比较方便,由于没有说明,当时也试了很久,字段值的存放格式是:
| tag |
|,,,,,|
使用field类型,就可以实现了。这里的分隔符不仅仅可以使用逗号,还可以使用空格,或者其他字符,如:
| tag |
|%% |
Sphix也是可以识别的,不过,还是统一用分隔符比较好。^-^

如何在sphinxse中使用?

在sphinxSE中用WHERE query='filter=ids,2345,5334' 即可实现SQL中WHERE ids IN (,)的效果。
修改sphinx最大输出记录数
归纳如下:
Sphinx的查询默认最大记录数是:,而我们想更改这个数值。就需要更改三个地方。
1是更改sphinx.conf配置文件的:max_matches = #后面数字就是你想查询的最大记录数。建议在1000~10000之内。
2是在api调用时,$cl->SetLimits($pageStart, $pageSize, $max_limits);用SetLimits的第三个参数更改为你想要的显示最大记录数。
修改sphinxclient.php 中max_matches 问题是这样的,信息列表页的分页里显示有100多页,但到51页的时候不显示正确的信息列表了。按惯例,输出结果,查看可疑之处。发现返回的结果里total永远都是1000,total_found大概是分页中显示的页数和每页信息数的乘积,这说明total_found返回的是真正的信息数,但查询结果的时候又受到了total的限制。
百度sphinx total_found,得知sphinx有个max_matches是限制匹配结果数的,看了sphinx.conf,发现其中设置的max_matches远大于查询结果数,看来代码中有设置了,又查看sphinx的应用类,发现了SetLimits($start, $limit, )这个东东,原来max_matches在这儿被定成了1000。
据说max_matches设定太大的话,查询速度会受影响,想了想把这个值设成变量,等于要查询的页数和每页信息数的乘积,这样就能得到正确的结果了,而且不会影响小页码的页面原查询速度。
http://www.ourjour.com/tag/sphinx-max_matches/

关于多属性查找问题的sphinx解决方案的更多相关文章

  1. 继承及属性查找+super()和mro()+多态

    继承及属性查找+super()和mro()+多态 一. ★继承 1. 什么是继承? 继承就是新建类的一种方式,新建的类我们称为子类或者叫派生类,被继承的类我们称为父类或者基类 子类可以使用父类中的属性 ...

  2. python属性查找(attribute lookup)

    在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候.     在上一文章末尾,给出了一段代码,就涉及到descriptor与att ...

  3. 继承&派生 属性查找

    # 在单继承背景下,无论是新式类还是经典类属性查找顺序都一样 # 先object->类->父类->... 实例: class Foo: def f1(self): print('Fo ...

  4. python之属性描述符与属性查找规则

    描述符 import numbers class IntgerField: def __get__(self, isinstance, owner): print('获取age') return se ...

  5. python属性查找 深入理解(attribute lookup)

    在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候. 在上一文章末尾,给出了一段代码,就涉及到descriptor与attribu ...

  6. BeautifulSoup 使用select方法详解(通过标签名,类名, id,组合,属性查找)

    import requestsfrom bs4 import BeautifulSoup blslib="html5lib"user_agent="Mozilla/5.0 ...

  7. python 3 属性查找与绑定方法

    1.属性查找 类有两种属性:数据属性和函数属性 (1)类的数据属性是所有对象共享的 #类的数据属性是所有对象共享的,id都一样 class OldboyStudent: school='oldboy' ...

  8. 面向对象 - 1.面向过程/2.面向对象/3.如何使用类/4.__init__方法/5.属性查找/6.补充知识/7.可扩展性高

    编程范式(流派): 面向对象编程,面向过程编程 各有用处!! 编程:语法+数据结构(list dict)+算法(逻辑)-----------------------------------1.面向过程 ...

  9. 面向对象:继承(经典类&新式类继承原理、属性查找)、派生

    继承: 继承是指类与类之间的关系,是一种“什么”是“什么”的关系. 继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基 ...

随机推荐

  1. 求前n项正整数的倒数和

    求前n项正整数的倒数和 前n项正整数的和是一个发散的序列,学过高等数学的这个都知道.所以它没有一个精确的公式,但是近似的公式是有的: 1 + 1/2 + 1/3 + …… + 1/n ≍ ln n + ...

  2. Zabbix Server端配置文件

    Zabbix Server端配置文件说明 # This is a configuration file for Zabbix Server process # To get more informat ...

  3. Activity-ListView

    在手机中经常有列表方式.如果Activity中只有唯一一个List(这也是通常的情况),可以继承ListActivity来实现.我们用两个例子来学习List. List例子一:利用Android自带的 ...

  4. 前端PHP入门-001-为什么学习PHP?

    写在前面的话 可能不知道能坚持多久,现在的我喜欢纯文字的描述! 希望能坚持写完,也是对自己的一个鞭策! 总顾及别人,那谁来顾及你! 为什么学习PHP? PHP入门简单,学习入门易入手[呵呵,都这么说, ...

  5. 浏览器发送URL的编码特性

    转载自:http://blog.csdn.net/wangjun_1218/article/details/4330244 浏览器发送URL的编码特性 尽管有很多规范URL的标准,例如RFC 3987 ...

  6. 【算法日记】2.算法中的大O符号

    大O符号是一种算法复杂度的相对表示方式. 1.大O表示算法的操作数,表示出算法运行的快慢 2.大O表示法指出了最糟糕情况下的运行时间,例如 简单查找的运行时间O(n),意味着在最糟糕的情况下,必须运行 ...

  7. Eclipse导入Java工程导入错误

    1.在一台电脑A上用Eclipse新建的Java工程,换了一台电脑B,再用Eclipse导入时却出现了错误,工程显示红色叹号,并有如下两个错误提示: The project cannot be bui ...

  8. 【BZOJ】1574: [Usaco2009 Jan]地震损坏Damage

    [算法]搜索 [题意]给定无向图,现在可能有一些点已经被删除,只给出信息是c个点不能到达结点1,求最少的不能到达结点1的个数(含已删除点). [题解] 真是一道奥妙重重的题目. 每个点不能到达结点1, ...

  9. 阿里云服务器部署笔记二(python3、Flask、uWSGI、Nginx)

    从git上把项目拉到服务器,项目可以在服务器上运行后,就只需要配置uwsgi和nginx了.它们的逻辑关系是:外部请求->nginx->uwsgi->项目实例. 一.配置uwsgi ...

  10. C语言分割字符串函数strtok

    在编程过程中,有时需要对字符串进行分割.而有效使用这些字符串分隔函数将会给我们带来很多的便利. 下面我将在MSDN中学到的strtok函数做如下翻译. strtok :在一个字符串查找下一个符号 ch ...