需求描述

  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_query = SELECT id,tagid FROM fy_content_tag

sql_attr_multi = uint tagid from field tagid
  
  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值

  原文:http://blog.sina.com.cn/s/blog_7eef675d0101fimb.html

sphinx设置多属性过滤的方法(setFilter)的更多相关文章

  1. vue的iview列表table render函数设置DOM属性值的方法

    { title: '负责人社保照片', key: 'leaderIdNumber', render: (h, params) => { return h('img',{domProps:{ sr ...

  2. 两种方法设置disabled属性

    //两种方法设置disabled属性 $('#fileup').attr("disabled",true); $('#fileup').attr("disabled&qu ...

  3. 两种设置disabled属性以及三种方法移除disabled属性

    //两种方法设置disabled属性 $('#areaSelect').attr("disabled",true); $('#areaSelect').attr("dis ...

  4. 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,

    编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ...

  5. dedecms 使noflag参数及其过滤多个属性的修改方法

    noflag='h' 是代表不包含头条属性的意思,其中flag就是属性, 自定义属性值:头条[h]推荐[c]图片[p]幻灯[f]滚动[s]跳转[j]图文[a]加粗[b]. noflag过滤多个属性的修 ...

  6. PHP中的__get()和__set()方法获取设置私有属性

    在类的封装中,获取属性可以自定义getXXX()和setXXX()方法,当一个类中有多个属性时,使用这种方式就会很麻烦.为此PHP5中预定义了__get()和__set()方法,其中__get()方法 ...

  7. 自定义类属性设置及setter、getter方法的内部实现

    属性是可以说是面向对象语言中封装的一个体现,在自定义类中设置属性就相当于定义了一个私有变量.设置器(setter方法)以及访问器(getter方法),其中无论是变量的定义,方法的声明和实现都是系统自动 ...

  8. 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。

    在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...

  9. js 获取和设置css3 属性值的实现方法

    众多周知 CSS3 增加了很多属性,在读写的时候就没有原先那么方便了. 如:<div style="left:100px"></div> 只考虑行间样式的话 ...

随机推荐

  1. (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly Detection&Recommender Systems

    这部分内容来源于Andrew NG老师讲解的 machine learning课程,包括异常检测算法以及推荐系统设计.异常检测是一个非监督学习算法,用于发现系统中的异常数据.推荐系统在生活中也是随处可 ...

  2. [转]Spring Security 可动态授权RBAC权限模块实践

    RBAC:基于角色的访问控制(Role-Based Access Control) 先在web.xml 中配置一个过滤器(必须在Struts的过滤器之前) <filter> <fil ...

  3. centos6.5编译安装nginx

    系统64位 centos6.5 nginx官网:http://nginx.org/ 下载nginx源码包: wget  http://nginx.org/download/nginx-1.6.2.ta ...

  4. 关于JS的This指针

    下面讨论一个执行上下文的最后一个属性——this指针的概念. This指针 A this value is a special object which is related with the exe ...

  5. Nginx + Keeplived双主测试

    Author: JinDate: 20130613Title: Nginx + Keeplived 双主测试 前言:一年多前做过一次测试,时间久了忘记了,现在又重新做一次 一.环境1.基本信息和规划p ...

  6. HDU 4632 Palindrome subsequence (2013多校4 1001 DP)

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

  7. 基于TCP通信的客户端断线重连

    转载:http://www.cnblogs.com/networkcomms/p/4304362.html 源码下载 在CS程序中,断线重连应该是一个常见的功能. 此处的断线重连主要指的是服务器端因为 ...

  8. PHP作前端java作后台

    前两周参加完 ThinkInLamp 的 PHP 架构师大会,听鸟哥一上午的分享,感慨很多,PHP 业界虽然方向不明荒废了两三年的时间,终究还是又重新崛起了.其实包括 Java 的重启问题,现在也已经 ...

  9. 18.并发类容器MQ

    package demo7.MQ; public class QueueData { private int id; private String name; private String taskC ...

  10. android 开源项目集合

    http://p.codekk.com/ http://www.apkbus.com/code.php http://androidxref.com/ https://www.androidos.ne ...