php对sphinx接口的查询模式学习教程

今天的这篇sphinx教程和大家分享phpsphinx接口的查询模式希望对大家有帮助。

 

有如下可选的匹配模式:

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的条件语句

 

1

2

3

4

5

6

7

8

9

10

11

12

13

//设置扩展匹配模式

 

$sphinx->SetMatchMode ( "SPH_MATCH_EXTENDED2" );

 

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

 

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

 

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

 

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

 

//更多语法请查看官方文档匹配模式的说明<br><br>扩展匹配模式中值得一提的是搜索的字段,如果该字段被设置属性,那么扩展匹配搜索的字段默认是不包含这些属性的,只能用SetFilter()或者SetFilterRange()之类<br><br>之前我们设置了fromidtoidsendtime为属性,但又想在扩展匹配模式中又想用作条件该怎么办?<br><br>只要在sql_query语句中再选择多一次该字段就可以了<br><br>sql_query = SELECT emailid,fromid,fromid,toid,toid,subject,content,sendtime,sendtime,attachement FROM email<br><br>//设置完成记得重新建立索引<br><br>更多条件技巧<br>只是一些技巧,但不建议使用的部署环境中,至于为什么,请看文章结尾<br><br><br><br><<=>>=<br>默认sphinx没有这些比较符。<br><br>假如我想邮件的发送时间大于某一日期怎么办?用SetFilterRange()方法模拟一下<br><br>

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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

 

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

 

  

 

//大于某一时间截$time

 

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

 

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

 

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

 

//大于某一时间截$time

 

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

 

1

<br><br>IS NOT NULL<br>怎样搜索为空的字段,比如我要搜索附件为空的邮件,有人可能会想 @attachment ('')不就可以了吗?其实这是搜索两个单引号。。。sphinx搜索的字符串不用加引号的<br><br>目前sphinx是没有提供这样的功能,其实可以在mysql语句上作手脚:<br><br>sql_query = SELECT emailid,fromid,toidsubject,content,sendtime,attachement != '' as attach is not null FROM email //这里返回了一个新字段attachisnotnull,当attachisnotnull1的时候附件就不为空了<br><br>//设置完成记得重新建立索引<br><br><br><br>FIND_IN_SET()<br>搜索包含某一附件的邮件,mysql习惯用FIND_IN_SET这么简单一句就搞定了,在sphinx中必需在配置里设置属性sql_attr_multi 多值属性(MVA):<br><br>sql_attr_multi = attachment #attachment可以是逗号分隔的附件ID,或者是空格、分号等sphinx都能识别<br><br>

 

1

2

3

4

5

6

7

8

9

10

11

12

13

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

 

  

 

然后PHP中可以使用SetFilter()

 

//搜索包含附件ID12邮件,mysql语法是这样FIND_IN_SET(`attachment`, '1,2')

 

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

 

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

 

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

 

1

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

 

 

原文来自:博客园/企久Terry

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值