PHP 中使用 sphinx 实现全文搜索实例
下载的 sphinx 包里面有针对各种语言的 API 接口文档,我们这里使用 sphinxapi.php 文件,将这个文体复制到你的项目库文件夹,接下来开始我们的编程之旅。
引入 sphinxapi.php 文件
include('sphinxapi.php');
设置查询参数开始查询
$search = new SphinxClient(); $search->setServer('127.0.0.1', 9312); $search->setLimits(0, 10, 1000, 0); $search->SetMatchMode(SPH_MATCH_ANY); $res = $search->query($s, "magnet");
筛选参数
//筛选cat=2 $search->SetFilter("cat", array(2)); //仅在id为1、3、7的文章中搜索 $search->SetFilter("id", array(1, 3, 7));
范围筛选
//筛选发布时间为今天,参数为int时间戳 $search->SetFilterRange("starttime",123,124); //筛选价格 $search->SetFilterRange("price",10.0,99.9);
分组
//按照item_id分组,并且按照order desc排序 $search->SetGroupBy("item_id",SPH_GROUP_ATTR,"order desc");
排序模式
//按照price desc排序 $search->SetSortMode(SPH_SORT_ATTR_DESC, "price");
注意:会被 SetGroupBy 中的排序覆盖
匹配模式
// 匹配查询词中的任意一个 $search->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, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生。
从 index 索引中搜索电影
$search->AddQuery('电影', 'index'); $search->ResetFilters();//重置筛选条件 $search->ResetGroupBy();//重置分组 $res = $search->RunQuries();
批量查询(或多查询)使 searchd 能够进行可能的内部优化,并且无论在任何情况下都会减少网络连接和进程创建方面的开销。相对于单独的查询,批量查询不会引入任何额外的开销。因此当您的Web 页运行几个不同的查询时,一定要考虑使用批量查询。
例如多次运行同一个全文查询,但使用不同的排序或分组设置,这会使 searchd 仅运行一次开销昂贵的全文检索和相关度计算,然后在此基础上产生多个分组结果。
有时不仅需要简单地显示搜索结果,而且要显示一些与类别相关的计数信息,例如按制造商分组后的产品数目,此时批量查询会节约大量的开销。 若无批量查询,您会必须将这些本质上几乎相同的查询运行多次并取回相同的匹配项,最后产生不同的结果集。若使用批量查询,您只须将这些查询简单地组成一个 批量查询,Sphinx 会在内部优化掉这些冗余的全文搜索。
AddQuery() 在内部存储全部当前设置状态以及查询,您也可在后续的 AddQuery() 调用中改变设置。早先加入的查询不会被影响,实际上没有任何办法可以改变它们。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论