6.2.通用搜索设置
6.2.1.SetLimits (设置结果集偏移量)
原型:function SetLimits ( $offset, $limit, $max_matches=0, $cutoff=0 )
给服务器端结果集设置一个偏移量($offset
)和从那个偏移量起向客户端返回的匹配项数目限制($limit
)。并且可以在服务器端设定当前查询的结果集大小($max_matches
),另有一个阈值($cutoff
),当找到的匹配项达到这个阀值时就停止搜索。全部这些参数都必须是非负整数。
前两个参数的行为与MySQL LIMIT子句中参数的行为相同。他们令searchd
从编号为$offset
的匹配项开始返回最多$limit
个匹配项。偏移量($offset
)和结果数限制($limit
)的默认值分别是0和20,即返回前20个匹配项。
max_matches
这个设置控制搜索过程中searchd
在内存中所保持的匹配项数目。一般来说,即使设置了max_matches
为1,全部的匹配文档也都会被处理、评分、过滤和排序。但是任一时刻只有最优的N个文档会被存储在内存中,这是为了性能和内存使用方面的原因,这个设置正是控制这个N的大小。注意,max_matches
在两个地方设置。针对单个查询的限制由这个API调用指定。但还有一个针对整个服务器的限制,那是由配置文件中的max_matches
设置控制的。为防止滥用内存,服务器不允许单个查询的限制高于服务器的限制。
在客户端不可能收到超过max_matches
个匹配项。默认的限制是1000,您应该不会遇到需要设置得更高的情况。1000个记录足够向最终用户展示了。如果您是想将结果传输给应用程序以便做进一步排序或过滤,那么请注意,在Sphinx端完成效率要高得多。
$cutoff
设置是为高级性能优化而提供的。它告诉searchd
在找到并处理$cutoff
个匹配后就强制停止。
6.2.2.SetMaxQueryTime (设置最大搜索时间)
原型:function SetMaxQueryTime ( $max_query_time )
设置最大搜索时间,以毫秒为单位。参数必须是非负整数。默认值为0,意思是不做限制。
这个设置与SetLimits()中的$cutoff
相似,不过这个设置限制的是查询时间,而不是处理的匹配数目。一旦处理时间已经太久,本地搜索查询会被停止。注意,如果一个搜索查询了多个本地索引,那这个限制独立地作用于这几个索引。
6.2.3.SetOverride (设置临时属性值覆盖)
原型:function SetOverride ( $attrname, $attrtype, $values )
设置一个临时的(只对单个查询有效)针对不同文档的属性值覆盖。只支持标量属性。$value是一个哈希表,他的键是要覆盖属性的文档ID,之是对应该文档ID的要覆盖的值。 于版本0.9.9-rc1引入。
属性覆盖特性使用户可以针对一次查询“临时性地”修改一些文档的值,不影响其他查询。这个函数可以用来进行数据个性化。例如,假设正在实现一个个性 化搜索函数,用来将朋友推荐的帖子排在前面,这类数据不仅是动态的,而且是个性化的,因此不能简单地把这种数据放入索引,因为不能影响其他用户的搜索。而 覆盖机制是针对单个查询的,不会影响其他人。因此可以,比如说,给每个文档设置一个“friends_weight”属性,默认值是0,然后临时将文档 123,456,789(当前用户的朋友推荐的)的这个属性设置为1,最后用这个值进行相关度计算。
6.2.4.SetSelect (设置返回信息的内容)
原型:function SetSelect ( $clause )
设置select子句,列出具体要取出的属性以及要计算并取出的expressions。子句的语法模仿了SQL。于版本0.9.9-rc1引入。
SetSelect()于标准SQL查询中SELECT和FROM之间的部分非常相近。它允许你指定要取出哪些属性(列),以及在这些列上要计算和 取出哪些表达式。与SQL语言的区别是,表达式必须用关键字AS给每个表达式取一个别名,别名必须是有效的标识符(由字母和数字组成)。在SQL里面可以 这样做,但是不是强制的。Sphinx强制必须有别名,以便计算结果总是可以以一个“正常”的名字在结果集中返回,或者在其他子句中引用,等等。
其他方面基本上等同于SQL。支持星号(“*”),支持函数,支持任意数目的表达式。计算出的表达式可以用于排序、过滤和分组,这与其他常规属性相同。
从版本0.9.9-rc2开始,允许使用GROUP BY的时候使用聚集函数(AVG(), MIN(), MAX(), SUM())。
表达式排序(Section4.5, “SPH_SORT_EXPR 模式”)和地表距离计算函数(Section6.4.5, “SetGeoAnchor (设置地表距离锚点)”)现在的内部实现就是这种表达式计算机制,分别使用“魔法名字”“@expr”和“@geodist”。
示例:
$cl->SetSelect ( "*, @weight+(user_karma+ln(pageviews))*0.1 AS myweight" ); $cl->SetSelect ( "exp_years, salary_gbp*{$gbp_usd_rate} AS salary_usd, IF(age>40,1,0) AS over40" ); $cl->SetSelect ( "*, AVG(price) AS avgprice" );