深入解析php之sphinx
<?php
//参数筛选
//筛选cat_id=2
$cl->setfilter("cat_id",array(2));
//仅在id为1、3、7的子论坛中搜索
$cl->setfilter("forum_id",array(1,3,7));
//范围筛选
//筛选发布时间为今天,参数为int时间戳
$cl->setfilterrange("starttime",123,124);
//筛选价格
$cl->setfilterrange("price",10.0,99.9);
// 分组
//按照item_id分组,并且按照order desc排序
$cl->setgroupby("item_id",sph_group_attr,"order desc");
//排序模式
//按照price desc排序
$cl->setsortmode(sph_sort_attr_desc,"price");
注意:会被setgroupby中的排序覆盖
// 匹配查询词中的任意一个
$cl->setmatchmode ( sph_match_any );
sph_match_all, 匹配所有查询词(默认模式);
sph_match_any, 匹配查询词中的任意一个;
sph_match_phrase, 将整个查询看作一个词组,要求按顺序完整匹配;
sph_match_boolean, 将查询看作一个布尔表达式 (参见 第 5.2 节 “布尔查询语法”);
sph_match_extended, 将查询看作一个coreseek/sphinx内部查询语言的表达式 (参见 第 5.3 节 “扩展查询语法”). 从版本coreseek 3/sphinx 0.9.9开始, 这个选项被选项sph_match_extended2代替,它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容——这样即使 sphinx及其组件包括api升级的时候,旧的应用程序代码还能够继续工作。
sph_match_extended2, 使用第二版的“扩展匹配模式”对查询进行匹配.
sph_match_fullscan, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生.
//从0开始查询,查询30条,返回结果最多为1000
$cl->setlimits(0,30,1000);
// 从名称为index的sphinx索引查询“电影票”
$cl->query("电影票","index");
// 从名称为index的sphinx索引查询“电影票”
$sp->setgroupby('item_id',sph_group_attr,'s_order desc');
$sp->setfilter('city_id','1');
$sp->setfilter('cat_id',array(1));
$sp->setlimit(0,10,1000);
$sp->addquery('电影票','index');
$sp->resetfilters();//重置筛选条件
$sp->resetgroupby();//重置分组
$sp->setgroupby('item_id', sph_groupby_attr, 's_order desc');
$sp->setfilter('city_id', '2');
$sp->setfilter('cat_id', array(2));
$sp->setlimits(0, 20, 1000);
$sp->addquery('温泉', 'index');
$sp->resetfilters();// 重置筛选条件
$sp->resetgroupby();//重置分组
$results = $sp->runquries();
批量查询(或多查询)使searchd能够进行可能的内部优化,并且无论在任何情况下都会减少网络连接和进程创建方面的开销。相对于单独的查询,批量查询不会引入任何额外的开销。因此当您的web页运行几个不同的查询时,一定要考虑使用批量查询。
例如,多次运行同一个全文查询,但使用不同的排序或分组设置,这会使searchd仅运行一次开销昂贵的全文检索和相关度计算,然后在此基础上产生多个分组结果。
有时您不仅需要简单地显示搜索结果,而且要显示一些与类别相关的计数信息,例如按制造商分组后的产品数目,此时批量查询会节约大量的开销。 若无批量查询,您会必须将这些本质上几乎相同的查询运行多次并取回相同的匹配项,最后产生不同的结果集。若使用批量查询,您只须将这些查询简单地组成一个 批量查询,sphinx会在内部优化掉这些冗余的全文搜索。
addquery()在内部存储全部当前设置状态以及查询,您也可在后续的addquery()调用中改变设置。早先加入的查询不会被影响,实际上没有任何办法可以改变它们。
用上述代码,第一个查询会在“documents”索引上查询“hello world”并将结果按相关度排序,第二个查询会在“products”索引上查询“ipod”并将结果按价格排序,第三个查询在“books”索引上搜 索“harry potter”,结果仍按价格排序。注意,第二个setsortmode()调用并不会影响第一个查询(因为它已经被添加了),但后面的两个查询都会受影 响。
此外,在addquery()之前设置的任何过滤,都会被后续查询继续使用。因此,如果在第一个查询前使用setfilter(),则通过 addquery()执行的第二个查询(以及随后的批量查询)都会应用同样的过滤,除非你先调用resetfilters()来清除过滤规则。同时,你还 可以随时加入新的过滤规则
addquery()并不修改当前状态。也就是说,已有的全部排序、过滤和分组设置都不会因这个调用而发生改变,因此后续的查询很容易地复用现有设置。
addquery()返回runqueries()结果返回的数组中的一个下标。它是一个从0开始的递增整数,即,第一次调用返回0,第二次返回1,以此类推。这个方便的特性使你在需要这些下标的时候不用手工记录它们。
?>
下一篇: 医学常识
推荐阅读
-
Quartz之Job与JobDetail深入解析
-
Java8新特性之深入解析日期和时间_动力节点Java学院整理
-
深入解析PHP的Yii框架中的缓存功能
-
Quartz之Job与JobDetail深入解析
-
深入解析PHP的Laravel框架中的event事件操作
-
深入解析PHP的Yii框架中的event事件机制
-
Android Handler之消息循环的深入解析
-
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
-
Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)
-
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复