• 关于多属性查找问题的sphinx解决方案


    需求描述

    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 |
    |1,2,3,4,5,6|
    使用field类型,就可以实现了。这里的分隔符不仅仅可以使用逗号,还可以使用空格,或者其他字符,如:
    | tag |
    |1%3%14 60|
    Sphix也是可以识别的,不过,还是统一用分隔符比较好。^-^

    如何在sphinxse中使用?

    在sphinxSE中用WHERE query='filter=ids,2345,5334' 即可实现SQL中WHERE ids IN (2345,5334)的效果。
    修改sphinx最大输出记录数
    
    归纳如下:
    Sphinx的查询默认最大记录数是:1000,而我们想更改这个数值。就需要更改三个地方。
    1是更改sphinx.conf配置文件的:max_matches   = 10000 #后面数字就是你想查询的最大记录数。建议在1000~10000之内。
    2是在api调用时,$cl->SetLimits($pageStart, $pageSize, $max_limits);用SetLimits的第三个参数更改为你想要的显示最大记录数。
    3 修改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, 1000)这个东东,原来max_matches在这儿被定成了1000。
    据说max_matches设定太大的话,查询速度会受影响,想了想把这个值设成变量,等于要查询的页数和每页信息数的乘积,这样就能得到正确的结果了,而且不会影响小页码的页面原查询速度。
    http://www.ourjour.com/tag/sphinx-max_matches/
  • 相关阅读:
    视频号视频批量下载
    DAST 黑盒漏洞扫描器 第一篇:流量
    精益六西格玛,研发团队提质增效的管理神器
    如何通过相对规模来估算用户故事?
    SQL SERVER添加表注释、字段注释
    PowerDesigner 将Comment中的字符COPY至Name中
    PowerDesigner设计表时显示注释列Comment和视图显示字段名设置
    unable to resolve dependency tree
    保存formData格式的数据
    vue md5加密和AES加密的简单使用
  • 原文地址:https://www.cnblogs.com/littlehb/p/3667821.html
Copyright © 2020-2023  润新知