需求描述

  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. AGC 014 B - Unplanned Queries

    题面在这里! 很显然的一件事是,我们把路径覆盖改成两个点分别到根的路径覆盖,答案是不会变的,因为lca以上被覆盖了两次不变奇偶性.. 这么做的好处就是,我们只需要考虑每个点的覆盖次数带来的影响就行了, ...

  2. 【树形dp】Treasure Hunt I

    [ZOJ3626]Treasure Hunt I Time Limit: 2 Seconds      Memory Limit: 65536 KB Akiba is a dangerous coun ...

  3. BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...

  4. BZOJ 2120 数颜色(带修改莫队)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...

  5. [UOJ347]通道

    锟题x1 以下用$d_k(x,y)$表示$x,y$在第树$k$上的距离,$h_k(x)$表示$x$在树$k$上的深度 先做两棵树,即最大化$d_1(x,y)+d_2(x,y)=h_1(x)+h_1(y ...

  6. 【分类讨论】Codeforces Round #407 (Div. 2) D. Weird journey

    考虑这个二元组中有一者是自环,则必然合法. 考虑这两条边都不是自环,如果它们不相邻,则不合法,否则合法. 坑的情况是,如果它是一张完整的图+一些离散的点,则会有解,不要因为图不连通,就误判成无解. # ...

  7. 【线段树】HDU1394 - Minimum Inversion Number

    [题目大意] 给出0..n-1组成的一段数,可以移动前几个数到结尾.求出最小的逆序对个数. [思路] 先用线段树求出逆序对,方法和树状数组是一样的.然后对于当前第一个数num[0],在它之后比它小的数 ...

  8. Spring+Spring MVC+MyBatis整合

    一.准备工作    1.1导入所需jar包 1.2数据库 CREATE TABLE `t_customer` ( `id` ) NOT NULL AUTO_INCREMENT, `username` ...

  9. 用asyncio的异步网络连接来获取sina、sohu和163的网站首页

    代码如下: import asyncio async def wget(host): print('wget %s...' % host) connect = asyncio.open_connect ...

  10. ORACLE查询表最近更改数据的方法

    修改项目时,涉及到了Oracle中许多表的修改(包括:增加.删除字段,修改注释等).由于开始没有进行记录,造成在上测试机时,忘记了具体修改过哪些表了.后来在网上查找了一些资料,例如: 1.select ...