首页 > 代码库 > sphinx SPH_MATCH_EXTENDED2 基本应用

sphinx SPH_MATCH_EXTENDED2 基本应用

匹配模式

有如下可选的匹配模式:

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)



评分模式。目前只在SPH_MATCH_EXTENDED2这个匹配模式中提供。参数必须是与某个已知模式对应的常数。

 

Sphinx默认计算两个对最终匹配权重有用的因子。主要是查询词组与文档文本的相似度。其次是称之为BM25的统计函数,该函数值根据关键字文档中的频率(高频导致高权重)和在整个索引中的频率(低频导致高权重)在0和1之间取值。

然而,有时可能需要换一种计算权重的方法——或者可能为了提高性能而根本不计算权值,结果集用其他办法排序。这个目的可以通过设置合适的相关度计算模式来达到。




===========================

技术分享

 

sphinx SPH_MATCH_EXTENDED2 基本应用