2014年2月15日 11:24:34

结论:

1.一次性使用多个索引进行查询的时候,返回的结果集中的fields字段没有什么清楚的意义(也没有找到文档对它的说明)

2.如果程序中一次搜索使用了多个索引,如果它们配置文件中过滤用的属性(aql_attr_uint,sql_field_string...)不全相同,那么最终返回的结果集中,只包含这几个索引中共有的属性

实验:

建立两个索引:goods_brand,  goods_cate, 分别是商品信息+品牌信息,商品信息+分类信息

  sql_query = select gid, gid as goodsid, siteid, catename from v_goods_info_cate
sql_attr_uint = siteid
sql_attr_uint = goodsid
sql_field_string = catename ####################### sql_query = select gid, gid as goodsid, siteid, brandname from v_goods_info_brand
sql_attr_uint = siteid
sql_attr_uint = goodsid
sql_field_string = brandname

注:

1. brandname 是商品的品牌名字, catename是商品的分类名字

2. brandname, catename 在索引时,既作为全文索引,又作为属性值返回

3. siteid在两个索引中都有,brandname和catename只在各自的索引中存在

测试程序代码

 $sphObj->AddQuery($keyword, 'goods_brand');
$sphObj->AddQuery($keyword, 'goods_cate');
$sphObj->AddQuery($keyword, 'goods_cate, goods_brand');
$sphObj->AddQuery($keyword, 'goods_brand,goods_cate'); var_dump($rs[0]['fields'], $rs[0]['words'], $rs[0]['matches']);

注:

在程序中做控制:搜索"机"这个字,在goods_cate和goods_brand索引中各只有两条记录符合要求(一共有4条记录):

1.分别执行测试代码的第1行和第2行,并用第6行打印出结果:

 //goods_brand
array (size=1)
0 => string 'brandname' (length=9) array (size=1)
'机' =>
array (size=2)
'docs' => string '10049' (length=5)
'hits' => string '10049' (length=5) array (size=2)
0 =>
array (size=3)
'id' => string '157978' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=3)
'goodsid' => string '157978' (length=6)
'siteid' => string '102' (length=3)
'brandname' => string '无锡一机' (length=12)
1 =>
array (size=3)
'id' => string '157980' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=3)
'goodsid' => string '157980' (length=6)
'siteid' => string '102' (length=3)
'brandname' => string '无锡一机' (length=12) //goods_cate
array (size=1)
0 => string 'catename' (length=8) array (size=1)
'机' =>
array (size=2)
'docs' => string '43986' (length=5)
'hits' => string '43986' (length=5) array (size=2)
0 =>
array (size=3)
'id' => string '158010' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=3)
'goodsid' => string '158010' (length=6)
'siteid' => string '102' (length=3)
'catename' => string '磨齿机' (length=9)
1 =>
array (size=3)
'id' => string '158014' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=3)
'goodsid' => string '158014' (length=6)
'siteid' => string '102' (length=3)
'catename' => string '旋压机' (length=9)

注:

每个索引单独被使用时,各对应两条记录(一共有4条记录)

每条匹配记录中的'attrs'中有siteid+brandname,或者,siteid+catename

2.当用一次查询用多个索引时:分别执行第3行和第4行,并用第6行打印出结果:

 //goods_brand在前,goods_cate在后
array (size=1)
0 => string 'brandname' (length=9) array (size=1)
'机' =>
array (size=2)
'docs' => string '54035' (length=5)
'hits' => string '54035' (length=5) array (size=4)
0 =>
array (size=3)
'id' => string '157978' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=2)
'goodsid' => string '157978' (length=6)
'siteid' => string '102' (length=3)
1 =>
array (size=3)
'id' => string '157980' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=2)
'goodsid' => string '157980' (length=6)
'siteid' => string '102' (length=3)
2 =>
array (size=3)
'id' => string '158010' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=2)
'goodsid' => string '158010' (length=6)
'siteid' => string '102' (length=3)
3 =>
array (size=3)
'id' => string '158014' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=2)
'goodsid' => string '158014' (length=6)
'siteid' => string '102' (length=3) //goods_cate在前,goods_brand在后
array (size=1)
0 => string 'catename' (length=8) array (size=1)
'机' =>
array (size=2)
'docs' => string '54035' (length=5)
'hits' => string '54035' (length=5) array (size=4)
0 =>
array (size=3)
'id' => string '157978' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=2)
'goodsid' => string '157978' (length=6)
'siteid' => string '102' (length=3)
1 =>
array (size=3)
'id' => string '157980' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=2)
'goodsid' => string '157980' (length=6)
'siteid' => string '102' (length=3)
2 =>
array (size=3)
'id' => string '158010' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=2)
'goodsid' => string '158010' (length=6)
'siteid' => string '102' (length=3)
3 =>
array (size=3)
'id' => string '158014' (length=6)
'weight' => string '1' (length=1)
'attrs' =>
array (size=2)
'goodsid' => string '158014' (length=6)
'siteid' => string '102' (length=3)

注:

两个索引被同时使用,只有先后顺序不一样时,4条记录都得到了(这样的结果是对的)

但是第3行和第47行的代码键值对表明,返回的结果集中的fields值没有什么特别的含义(至少我不知到,难道只和排在前边的索引使用的全文索引字段同步?肯定有什么意义,只是我没有总结到吧)

另外,查看结果知道,每一条匹配记录的'attrs'数组中只有siteid键值对

sphinx 同时使用多个索引进行检索探究的更多相关文章

  1. 使用Lucene索引和检索POI数据

    1.简介 关于空间数据搜索,以前写过<使用Solr进行空间搜索>这篇文章,是基于Solr的GIS数据的索引和检索. Solr和ElasticSearch这两者都是基于Lucene实现的,两 ...

  2. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!

    InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...

  3. Lucene 索引与检索架构图

  4. solr-用mmseg4j配置同义词索引和检索(IKanlyzer需要修改源码适应solr接口才能使用同义词功能)

    概念说明:同义词大体的意思是指,当用户输入一个词时,solr会把相关有相同意思的近义词的或同义词的term的语段内容从索引中取出,展示给用户,提高交互的友好性(当然这些同义词的定义是要在配置文件中事先 ...

  5. sphinx通过增量索引实现近实时更新

    一.sphinx增量索引实现近实时更新设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少. 例如.原来的数据 ...

  6. Sphinx和coreseek检索引擎

    Sphinx是检索英文用,coreseek是检索中文用. Sphinx(斯芬克斯)是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索 ...

  7. sphinx 增量索引 实现近实时更新

    一.sphinx增量索引的设置   数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万条 ...

  8. Sphinx 增量索引更新

    是基于PHP API调用,而不是基于sphinxSE.现在看来sphinxSE比API调用更简单的多,因为之前没有想过sphinxSE,现在先把API的弄明白.涉及到的:sphinx 数据源的设置,简 ...

  9. sphinx 增量索引 及时更新、sphinx indexer索引合成时去旧和过滤办法(转)

    一.sphinx增量索引的设置    数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万 ...

随机推荐

  1. iOS中block循环引用问题

    1.block是控制器对象的一个属性,则在block内部使用self将会引起循环应用 typedef void(^TestBlock)(); @interface SecondViewControll ...

  2. 600字让你读懂Git

    设想你现在位于 alpha/ 目录下,这里有一个文本文件 number.txt,里面的内容只有一个词:“first”. 现在执行 git init 将这个 alpha 文件夹初始化为 Git 仓库. ...

  3. Python模块-pandas

    目录 数据读取 数据探索 数据清洗 数据清洗 类型转换 缺失值 重复值 值替换 修改表结构 新增列 删除列 删除行 修改列名 数据分组(数值变量) 数据分列(分类变量) 设置索引 排序 数据筛选/切片 ...

  4. Torch,Tensorflow使用: Ubuntu14.04(x64)+ CUDA8.0 安装 Torch和Tensorflow

    系统配置: Ubuntu14.04(x64) CUDA8.0 cudnn-8.0-linux-x64-v5.1.tgz(Tensorflow依赖) Anaconda 1. Torch安装 Torch是 ...

  5. ehcache、redis应用场景比较

    应用场景: ehcache是Hibernate中默认的CacheProvider,直接在jvm虚拟机中缓存,速度快,效率高:但是缓存共享麻烦,集群分布式应用不方便.  . 缓存数据有两级:内存和磁盘, ...

  6. P3254 圆桌问题

    题目链接 非常简单的一道网络流题 我们发现每个单位的人要坐到不同餐桌上,那也就是说每张餐桌上不能有同一单位的人.这样的话,我们对于每个单位向每张餐桌连一条边权为1的边,表示同一餐桌不得有相同单位的人. ...

  7. 【BZOJ2257】[JSOI2009]瓶子和燃料(数论)

    [BZOJ2257][JSOI2009]瓶子和燃料(数论) 题面 BZOJ 洛谷 题解 很明显就是从\(n\)个数里面选\(K\)个数让他们的\(gcd\)最大. 暴力找所有数的因数,拿个什么东西存一 ...

  8. 【BZOJ4883】棋盘上的守卫(最小生成树)

    [BZOJ4883]棋盘上的守卫(最小生成树) 题面 BZOJ 题解 首先\(n\)行\(m\)列的棋盘显然把行列拆开考虑,即构成了一个\(n+m\)个点的图.我们把格子看成边,那么点\((x,y)\ ...

  9. 解题:九省联考2018 秘密袭击CoaT

    题面 按照*Miracle*的话来说,网上又多了一篇n^3暴力的题解 可能是因为很多猫题虽然很好,但是写正解性价比比较低? 直接做不可做,转化为统计贡献:$O(n)$枚举每个权值,直接统计第k大大于等 ...

  10. 【codevs1006】等差数列

    题目大意:给定一个 N(N <= 100) 个数字组成的集合,从中取出若干数字组成的等差数列最长是多少. 题解:由于这道题数据范围较小,可以直接依据每个数字进行枚举.首先,这道题给出的是一个集合 ...