// 匹配查询词中的任意一个
$cl->SetMatchMode ( SPH_MATCH_ANY );
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, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生.
//从0开始查询,查询30条,返回结果最多为1000
$sp->setFilter('city_id', '2');
$sp->setFilter('cat_id', array(2));
$sp->setLimits(0, 20, 1000);
$sp->AddQuery('温泉', 'index');
$sp->ResetFilters();// 重置筛选条件
$sp->ResetGroupBy();//重置分组
批量查询(或多查询)使searchd能够进行可能的内部优化,并且无论在任何情况下都会减少网络连接和进程创建方面的开销。相对于单独的查询,批量查询不会引入任何额外的开销。因此当您的Web页运行几个不同的查询时,一定要考虑使用批量查询。
例如,多次运行同一个全文查询,但使用不同的排序或分组设置,这会使searchd仅运行一次开销昂贵的全文检索和相关度计算,然后在此基础上产生多个分组结果。
有时您不仅需要简单地显示搜索结果,而且要显示一些与类别相关的计数信息,例如按制造商分组后的产品数目,此时批量查询会节约大量的开销。 若无批量查询,您会必须将这些本质上几乎相同的查询运行多次并取回相同的匹配项,最后产生不同的结果集。若使用批量查询,您只须将这些查询简单地组成一个 批量查询,Sphinx会在内部优化掉这些冗余的全文搜索。
AddQuery()在内部存储全部当前设置状态以及查询,您也可在后续的AddQuery()调用中改变设置。早先加入的查询不会被影响,实际上没有任何办法可以改变它们。
用上述代码,第一个查询会在“documents”索引上查询“hello world”并将结果按相关度排序,第二个查询会在“products”索引上查询“ipod”并将结果按价格排序,第三个查询在“books”索引上搜 索“harry potter”,结果仍按价格排序。注意,第二个SetSortMode()调用并不会影响第一个查询(因为它已经被添加了),但后面的两个查询都会受影 响。
此外,在AddQuery()之前设置的任何过滤,都会被后续查询继续使用。因此,如果在第一个查询前使用SetFilter(),则通过 AddQuery()执行的第二个查询(以及随后的批量查询)都会应用同样的过滤,除非你先调用ResetFilters()来清除过滤规则。同时,你还 可以随时加入新的过滤规则
AddQuery()并不修改当前状态。也就是说,已有的全部排序、过滤和分组设置都不会因这个调用而发生改变,因此后续的查询很容易地复用现有设置。
AddQuery()返回RunQueries()结果返回的数组中的一个下标。它是一个从0开始的递增整数,即,第一次调用返回0,第二次返回1,以此类推。这个方便的特性使你在需要这些下标的时候不用手工记录它们。
本文链接
打开文件操作:
可以看到,函数返回的是一个资源句柄(resource handle),类似与C中的文件指针,读和写都从文件的指针处开始。
$filename是文件的路径,可以使用绝对路径和相对路径。
$mode是打开文件的模式,也就是文章的重点。
$use_include_path 规定是否搜索指定的包含路径。
$context是上下文选项。
后面两个可以不用管,主要是mode参数。mode是告诉计算机对文件的访问操作及权限设置。在操作手册中可以看到:
mode说明'r'只读方式打开,将文件指针指向文件头。'r+'读写方式打开,将文件指针指向文件头。'w'写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。'w+'读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。'a'写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。'a+'读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。'x'创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。'x+'创建并以读写方式打开,其他的行为和 'x' 一样。在学C的时候,就对文件操作存在恐惧感和抵触情绪,当时觉得对数据库的操作才是王道,更何况有这么多文件的mode.....
后来看了神作《Unix编程思想》,才知道 文本 才是数据表示的精髓......废话不多说,我们用比较的方法来方便记住:
r类(表示r和r+,下同):主打读(read)操作。文件若存在,指针指向文件头,文件不存在则返回false。
w类:主打写(write)操作。文件若存在,清空文件,指针指向文件头,文件不存在则创建文件。
a类:主打添加(append)操作。指针指向文件尾,文件不存在则创建文件。
x类:谨慎写操作。与w类类似,但文件若存在则返回false。
现在能清晰点了,通过例子来看看几个易混的模式:
同为读写的r+、w+、a+、x+:
*例如存在文件article.txt,内容如下:
'Always be thankful!. We all have so much thankful for.'
*/
$file = fopen($_SERVER['DOCUMENT_ROOT'].'/learn/document/article.txt', 'mode')
or exit('Unable to open file');
$output = 'something new.';
fwrite($file,$output);
fclose($file);
若mode为‘rb+’,那么文件被改为:
'Something new.kful!. We all have so much thankful for.'
若mode为‘wb+’,那么文件被改为:
'Something new.'
若mode为‘ab+’,那么文件被改为:
Always be thankful!We all have so much thankful for. something new.
若mode为‘xb+’,那么显示错误:
Unable to open file 并停止脚本。
另外,还有一个c模式,可不用记住了。
操作文件还有b(二进制)和t(文本)模式,t模式可以转换一些\t \n类的标记符号,但如果要打开图片等二进制文件,或者保证code的移植性,建议指定b模式。
最后说一下换行符,这得追溯到电传打字机的历史,有兴趣的可以百度。
在原始的表示里,/n表示newline,即光标向下移动一行,左右位置不动;而/r表示return,即光标回到行首。按理说,正常的换行应该是/n/t,但在unix系统里换行用 /n 来代替,windows则用 /r/n ,而在mac中用 /r 。这样,不同的文本在不同的系统里表现也大相径庭,给代码带来不少的麻烦。
PHP为我们考虑了这个问题,通过引入一个常量PHP_EOL(PHP_End Of Line,好记吧!),就可让PHP自动在不同的平台下选择相应的换行符,大大加强了代码的可移植性。
OK,打完收工。
本文链接