sphinx Coreseek全文检索php实例代码api接口调用

在php全文检索应用中,我们用sphinx来实现全文检索,php如何使用sphinx-Coreseek来实现中文全文检索呢,一起看下sphinx Coreseek全文检索在php中的实例代码:

数据结构:

</p>
<p>CREATE TABLE email (<br />
emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '邮件id',</p>
<p>fromid int(10) unsigned NOT NULL default '0' COMMENT '发送人ID',</p>
<p>toid int(10) unsigned NOT NULL default '0' COMMENT '收件人ID',<br />
content text unsigned NOT NULL COMMENT '邮件内容',<br />
subject varchar(100) unsigned NOT NULL COMMENT '邮件标题',</p>
<p>sendtime int(10) NOT NULL COMMENT '发送时间',</p>
<p>attachment varchar(100) NOT NULL COMMENT '附件ID,以逗号分割', PRIMARY KEY (emailid),<br />
) ENGINE=MyISAM';</p>
<p>

coreseek/api目录下提供了PHP的接口文件 sphinxapi.php,这个文件包含一个SphinxClient的类

在PHP引入这个文件,new一下

<br />
$sphinx = new SphinxClient();</p>
<p>//sphinx的主机名和端口</p>
<p>$sphinx-&gt;SetServer ( 'loclahost', 9312 );</p>
<p>//设置返回结果集为php数组格式</p>
<p>$sphinx-&gt;SetArrayResult ( true );</p>
<p>//匹配结果的偏移量,参数的意义依次为:起始位置,返回结果条数,最大匹配条数</p>
<p>$sphinx-&gt;SetLimits(0, 20, 1000);</p>
<p>//最大搜索时间</p>
<p>$sphinx-&gt;SetMaxQueryTime(10);</p>
<p>//执行简单的搜索,这个搜索将会查询所有字段的信息,要查询指定的字段请继续看下文</p>
<p>$index = 'email' //索引源是配置文件中的 index 类,如果有多个索引源可使用,号隔开:'email,diary' 或者使用'*'号代表全部索引源</p>
<p>$result = $sphinx-&gt;query ('搜索关键字', $index); </p>
<p>print_r($result);</p>
<p>

$result是一个数组,其中

total是匹配到的数据总数量

matches是匹配的数据,包含id,attrs这些信息

words是搜索关键字的分词

你可能奇怪为什么没有邮件的内容这些信息,其实sphinx并不会返回像mysql那样的数据数组,因为sphinx本来就没有记录完整的数据,只记录被分词后的数据。

具体还要看matches数组,matches中的ID就是指配置文件中sql_query SELECT语句中的第一个字段,我们配置文件中是这样的

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

所以matches中的ID是指emailid

至于weight是指匹配的权重,一般权重越高被返回的优先度也最高,匹配权重相关内容请参考官方文档

attrs是配置文件中sql_attr_ 中的信息,稍后会提到这些属性的用法

说了这么多,即使搜索到结果也不是我们想要的email数据,但事实sphinx是不记录真实数据的,所以要获取到真实email数据还要根据matches中的ID去搜索mysql的email表,但总体来说这样一来一回的速度还是远远比mysql的LIKE快得多,前提是几十万数据量以上,否则用sphinx只会更慢。

接下来介绍sphinx一些类似mysql条件的用法

</p>
<p>//emailid的范围</p>
<p>$sphinx-&gt;SetIdRange($min, $max); </p>
<p>//属性过滤,可过滤的属性必需在配置文件中设置sql_attr_    ,之前我们定义了这些</p>
<p>    sql_attr_uint            = fromid</p>
<p>    sql_attr_uint            = toid</p>
<p>    sql_attr_timestamp  = sendtime</p>
<p>//如果你想再次修改这些属性,配置完成后记得重新建立索引才能生效</p>
<p>//指定一些值</p>
<p>$sphinx-&gt;SetFilter('fromid', array(1,2));    //fromid的值只能是1或者2</p>
<p>//和以上条件相反,可增加第三个参数</p>
<p>$sphinx-&gt;SetFilter('fromid', array(1,2), false);    //fromid的值不能是1或者2</p>
<p>//指定一个值的范围</p>
<p>$sphinx-&gt;SetFilterRange('toid', 5, 200);    //toid的值在5-200之间</p>
<p>//和以上条件相反,可增加第三个参数</p>
<p>$sphinx-&gt;SetFilterRange('toid', 5, 200, false);    //toid的值在5-200以外</p>
<p>//执行搜索</p>
<p>$result = $sphinx-&gt;query('关键字', '*');</p>
<p>

排序模式
可使用如下模式对搜索结果排序:

SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)

SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)

SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)

SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序

SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。

SPH_SORT_EXPR 模式,按某个算术表达式排序

<br />
//使用属性排序</p>
<p>//以fromid倒序排序,注意当再次使用SetSortMode会覆盖上一个排序</p>
<p>$sphinx-&amp;gt;SetSortMode ( &quot;SPH_SORT_ATTR_DESC&quot;, 'fromid');</p>
<p>//如果要使用多个字段排序可使用SPH_SORT_EXTENDED模式</p>
<p>//@id是sphinx内置关键字,这里指emailid,至于为什么是emailid,自己思考一下</p>
<p>$sphinx-&amp;gt;SetSortMode ( &quot;SPH_SORT_ATTR_DESC&quot;, 'fromid ASC, toid DESC, @id DESC');</p>
<p>//执行搜索</p>
<p>$result = $sphinx-&amp;gt;query('关键字', '*');</p>
<p>

//更多请查看官方文档排序模式的说明

匹配模式
有如下可选的匹配模式:

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

<br />
//设置扩展匹配模式</p>
<p>$sphinx-&gt;SetMatchMode ( &quot;SPH_MATCH_EXTENDED2&quot; );</p>
<p>//查询中使用条件语句,字段用@开头,搜索内容包含测试,toid等于1的邮件:</p>
<p>$result = $sphinx-&gt;query('@content (测试) &amp; @toid =1', '*');</p>
<p>//用括号和&amp;(与)、|、(或者)、-(非,即!=)设置更复杂的条件</p>
<p>$result = $sphinx-&gt;query('(@content (测试) &amp; @subject =呃) | (@fromid -(100))', '*');</p>
<p>//更多语法请查看官方文档匹配模式的说明</p>
<p>

原文:http://www.php100.com/html/php/lei/2013/0916/6188.html