php对sphinx接口的查询模式

有如下可选的匹配模式:

SPH_MATCH_ALL, 匹配所有查询词(默认模式);

SPH_MATCH_ANY, 匹配查询词中的任意一个;

SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配;

SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式

SPH_MATCH_EXTENDED, 将查询看作一个CoreSeek/Sphinx内部查询语言的表达式 . 从版本Coreseek 3/Sphinx 0.9.9开始, 这个选项被选项SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容——这样即使Sphinx及其组件包括API升级的时候,旧的应用程序代码还能够继续工作。

SPH_MATCH_EXTENDED2, 使用第二版的“扩展匹配模式”对查询进行匹配.

SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生.

我们要关注的主要是SPH_MATCH_EXTENDED2扩展匹配模式,扩展匹配模式允许使用一些像mysql的条件语句

//设置扩展匹配模式

$sphinx->SetMatchMode ( "SPH_MATCH_EXTENDED2" );

//查询中使用条件语句,字段用@开头,搜索内容包含测试,toid等于1的邮件:

$result = $sphinx->query(‘@content (测试) & @toid =1‘, ‘*‘);

//用括号和&(与)、|、(或者)、-(非,即!=)设置更复杂的条件

$result = $sphinx->query(‘(@content (测试) & @subject =呃) | (@fromid -(100))‘, ‘*‘);

//更多语法请查看官方文档匹配模式的说明

扩展匹配模式中值得一提的是搜索的字段,如果该字段被设置属性,那么扩展匹配搜索的字段默认是不包含这些属性的,只能用SetFilter()或者SetFilterRange()之类

之前我们设置了fromid、toid、sendtime为属性,但又想在扩展匹配模式中又想用作条件该怎么办?

只要在sql_query语句中再选择多一次该字段就可以了

sql_query = SELECT emailid,fromid,fromid,toid,toid,subject,content,sendtime,sendtime,attachement FROM email

//设置完成记得重新建立索引

更多条件技巧只是一些技巧,但不建议使用的部署环境中,至于为什么,请看文章结尾

<、<=、>、>=默认sphinx没有这些比较符。

假如我想邮件的发送时间大于某一日期怎么办?用SetFilterRange()方法模拟一下
//大于等于某一时间截$time

$sphinx->SetFilterRange(‘sendtime‘, $time, 10000000000) //时间截最大是10个9,再加1是不可超越了。。

//大于某一时间截$time

$sphinx->SetFilterRange(‘sendtime‘, $time+1, 10000000000)

//小于等于某一时间截$time

$sphinx->SetFilterRange(‘sendtime‘, -1, $time)    //时间截最小是0,所以应该减1

//大于某一时间截$time

$sphinx->SetFilterRange(‘sendtime‘, -1, $time - 1)

IS NOT NULL怎样搜索为空的字段,比如我要搜索附件为空的邮件,有人可能会想 @attachment (‘‘)不就可以了吗?其实这是搜索两个单引号。。。sphinx搜索的字符串不用加引号的

目前sphinx是没有提供这样的功能,其实可以在mysql语句上作手脚:

sql_query = SELECT emailid,fromid,toidsubject,content,sendtime,attachement != ‘‘ as attach is not null FROM email //这里返回了一个新字段attachisnotnull,当attachisnotnull为1的时候附件就不为空了

//设置完成记得重新建立索引

FIND_IN_SET()搜索包含某一附件的邮件,mysql习惯用FIND_IN_SET这么简单一句就搞定了,在sphinx中必需在配置里设置属性sql_attr_multi 多值属性(MVA):

sql_attr_multi = attachment #attachment可以是逗号分隔的附件ID,或者是空格、分号等sphinx都能识别
//设置完成记得重新建立索引

然后PHP中可以使用SetFilter()

//搜索包含附件ID为1或2邮件,mysql语法是这样FIND_IN_SET(`attachment`, ‘1,2‘)

$sphinx->SetFilter(‘attachment‘, array(1,2))

//可以使用SetFilterRange,搜索包含附件ID在50-100范围的邮件

$sphinx->SetFilterRange(‘attachment‘, 50, 100)

总结如果你想一个免费、好用、极速的全文搜索引擎,sphinx无疑是最好的选择,但是不要忘记sphinx的目的:全文检索。不要去想那些乱七八糟条件。你想要把sphinx搜索变得像mysql那样灵活,可完全单独用在一些复杂的多条件搜索,像某些邮件的高级搜索,那么我建议你还是多花点时间在PHP或者mysql代码的优化上,因为那样可能会让你的搜索变得更慢。

最好的方法是以最简单的方法搜索到内容,将ID交还mysql数据库搜索。
时间: 2024-08-26 06:36:41

php对sphinx接口的查询模式的相关文章

coreseek/sphinx中的匹配模式

所谓匹配模式就是用户如何根据关键字在索引库中查找相关的记录. SPH_MATCH_ALL, 匹配所有查询分词(默认模式); 如"手机配件",不匹配 "我有一部手机",但可以匹配 "手机坏了,需要找配件". 因为"手机配件" 被分成 "手机","配件"两个词,匹配条件是必须同时包含这两个词,所以"我有一部手机"不符合匹配要求. SPH_MATCH_ANY, 匹配查询词中

详细解读 Cognos 的动态查询模式

发展背景 我们知道,对于BI(Business Intelligence商业智能的缩写,下同)系统而言,前端访问后台系统的整体响应时间是影响业务用户实际体验的重要指标.如果响应时间太长(一般而言超过10秒),即使前端的图形界面再眩再好看,也会严重打击最终用户对BI系统的使用兴趣.因此,BI系统的客户体验差往往是我们很多分析系统项目实施失败的重要原因之一. 为了应对这一挑战,IBM Cognos BI从版本 10.1.0 中开始提供了基于Java增强查询执行模式(Dynamic Query Mod

sphinx的联合查询(sphinx配置篇)

下面举例说明,sphinx的联合查询用法. 一,添加二张测试表和数据 1,users表和数据 mysql> desc users; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | 

sphinx教程 区段查询配置 命令(2)

首先查看配置文件 sphinx.conf 区段查询配置: # in sphinx.conf sql_query_range = SELECT MIN(id),MAX(id) FROM documents sql_range_step = 1000 sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end 如果这个表中,字段ID的最小值和最大值分别是1和2345,则sql_query将执行3次: 将 $start 替换为1

从头认识java-7.8 接口与工厂模式

这一章节我们来聊聊接口与工厂模式之间的关系. 接口是实现多重继承的途径,生成遵循某个接口协议的对象的典型方式是工厂设计模式. 这种设计模式使得接口与实现完全分开. package com.ray.ch07; interface Service { void doSomeThing(); } interface ServiceFactory { Service getService(); } class ServiceImpl implements Service { @Override publ

Oracle ADF VO排序及VO的查询模式

常规应用中,当需要使用Table向终端用户展示数据时,Table中数据的显示排序一致性极大程度的影响到了客户体验.通常希望诸如多次查询结果显示顺序相同.插入数据在原数据上方等的实现. ADF为开发人员提供了两种级别的排序,即数据库级别的排序及内存级别(In-Memory)的排序.需要同时使用这两种排序法,才能取得合适的排序效果.    (使用Oracle示例数据库HR中的Employees表作为示例) 数据源排序编辑VO的Query,设置Order by字段,这里设置Manager作为排序字段需

浅析微信支付:申请退款、退款回调接口、查询退款

本文是[浅析微信支付]系列文章的第八篇,主要讲解商户如何处理微信申请退款.退款回调.查询退款接口,其中有一些坑的地方,会着重强调. 浅析微信支付系列已经更新七篇了哟-,没有看过的朋友们可以看一下哦. 浅析微信支付:查询订单和关闭订单 浅析微信支付:支付结果通知 浅析微信支付:统一下单接口 在实际场景中,申请退款和退款回调接口是比较常用到的微信支付接口,这里我们会讲原路返回方式的退款,还有的是使用直接为用户付款到零钱.现金红包等方式来退款,此种情况主要会出现在客服退款时,不是全部退款的情况,也有的

调用API接口,查询手机号码归属地

使用https://www.juhe.cn/提供的接口,查询归属地 在官网注册key即可使用. 代码如下 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib, sys from urllib import urlencode, urlopen reload(sys) sys.setdefaultencoding('utf8') #调用接口,获取结果为二维字典 def getPageCode(url, params): par

F5负载均衡的rest接口拓展查询

F5负载均衡的rest接口拓展查询 问题描述: 接触过F5的小伙伴大概会发现,F5的rest接口返回中经常会包含isSubcollection这个字段,用来表示存在嵌套的结果,这样的方式在一定程度上缓解了设备一次请求拉取数据的压力,但在我们需要获取所有嵌套结果时,多次的http请求反而会增加性能开销,这时候,我们如何取消isSubcollection带来的弊端呢? {"profilesReference": { "link":"https://localh