Sphinx通用API(基于PHP)

2018-01-11 17:49:00
linefo
原创
1118

基于PHP,其他编程语言实现上可能有些许差别。
在Win或者Linux下可能支持的API方法数量/功能上有差别。


通用API方法



GetLastError (错误信息)


GetLastWarning (告警信息)


SetServer (设置搜索服务)



SetRetries (设置失败重试)



SetConnectTimeout (设置超时时间)



SetArrayResult (设置结果返回格式)



IsConnectError (检查链接错误)


通用搜索设置


SetLimits (设置结果集偏移量)


【PHP方法实现】




【描述】



SetMaxQueryTime (设置最大搜索时间)



SetOverride (设置临时属性值覆盖)



SetSelect (设置返回信息的内容)



全文搜索设置




SetMatchMode (设置匹配模式)


【PHP方法实现】


SphinxClient::setMatchMode( [匹配模式] )



【描述】


设置Sphinx全文查询的匹配模式,用于确定内容

这里讲的是coreseek(带mmseg中文分词机制的Sphinx)的情况!!

模式是常量的值!不是字符串!不能用双引号包含!


【匹配模式】


SPH_MATCH_ALL:匹配所有查询词


查询“手机配件”,分词机制分成 手机配件 两个词(如果没有mmseg,好像是分成手、机、配、件四个词);

所以能匹配“去买手机的一些配件”;

不能匹配“我有一部手机”;


SPH_MATCH_ANY:匹配查询词的任意一个


查询“手机配件”,分词机制分成 手机配件 两个词;

能匹配“去买手机的一些配件”;

也能匹配“我有一部手机”;


SPH_MATCH_PHRASE:将整个查询看作一个词组,要求按顺序完整匹配.


查询“手机配件”整体,不考虑分词的情况;

所以能匹配“买了很多手机配件”(类似 *手机配件* 这样的感觉);

不能匹配“去买手机的一些配件”和“我有一部手机”;

注意:匹配的时候会忽略空格,所以也能匹配到“买了很多手机 配件”;


SPH_MATCH_BOOLEAN:将查询看作一个布尔表达式,做条件判断


设置该模式后,需要配合Query方法,允许使用下面的逻辑运算符(与、或、非)和分组:

&:表示和,如 SphinxClient::Query("hello & world") 表示即含有hello也含world

|:表示或,同理如 hello | world

!:表示否,同理如 !hello

():表示分组,如(hello world)

注意:通过设置条件可以实现一些自由度高的过滤,如( cat !dog) | ( cat !mouse )表示匹配含有cat的同时不含dog和mouse的数据。


SPH_MATCH_EXTENDED:将查询看作一个Sphinx内部查询语言的表达式.


字面意思是匹配加强扩展,是考虑兼容性的旧模式,建议使用新的SPH_MATCH_EXTENDED2模式。


SPH_MATCH_FULLSCAN:使用完全扫描,忽略查询词汇.


暂不想理解。


SPH_MATCH_EXTENDED2:类似 SPH_MATCH_EXTENDED ,并支持评分和权重.


SPH_MATCH_EXTENDED 的进一步加强模式,扩展匹配时我们更多的用这个。

也是配合Query方法使用。

相关操作符(其实包含了SPH_MATCH_BOOLEAN模式的逻辑运算符):

&:表示与,如 hello & world,在这里它是一个隐式操作符,hello world和hello & world意义一致。

|:表示或,如 hello | world

!:表示否,如 !hello

():表示分组,如(hello world)

@:用来指定操作的字段(根据csft配置文件生成的索引里面的字段名),如 @i_title 上海路 表示在i_title字段里面搜索“上海路

[]:限制字段中查询词的位置,配合@使用,如 @i_title[5] 北海大道 表示搜索i_title字段时,匹配前5个词(和分词机制有关)中含有“北海大道”的数据。

/:阀值符号,限制至少出现的次数,这个没有试验成功

~:近似符号,没有试验成功

<<:顺序符号,规定搜索词出现顺序,没有试验成功

^:开始符号,指定以什么字符串开始,@i_title ^北海大道 表示在i_title字段中,以“北海大道”这个字符串开始的数据

$:结束符号,指定以什么字符串结束,@i_title 仅售42万$ 表示在i_title字段中,以“仅售42万”这个字符串结束的数据 



扩展使用

@i_title ^北海大道 仅售42万$表示在i_title字段中,以“北海大道”这个字符串开始,并且以“仅售42万”这个字符串结束的数据。

@(i_title,i_content) 北海大道:在i_title或i_content字段中,含有“北海大道”的数据


SetRankingMode (设置评分模式)


【PHP实现方法】



SphinxClient::SetRankingMode( [评分模式] )


【描述】


仅对SPH_MATCH_EXTENDED2模式起效。

Sphinx通过 查询词和文本相似度评分机制BM25统计函数评分机制 两个因素去考虑整体评分。

两种机制背后的算法都很复杂,以我的水平就算了(感觉像看高数的微积分),通过字面意思理解,就是两套计算搜索词和文本匹配度的评分机制,方式是通过赋予匹配项的不同权重实现。


【评分模式】


SPH_RANK_PROXIMITY_BM25:默认模式,同时使用两种评分机制

SPH_RANK_BM25:仅使用 BM25统计函数评分机制(与大多数全文检索引擎相同),速度快但搜索质量可能会下降

SPH_RANK_NONE:禁用评分模式,这是最快的方式,所有的匹配项都被赋予权重1

SPH_RANK_WORDCOUNT:根据关键词出现次数排序,然后把次数和字段的权重相乘,最后将积求和

SPH_RANK_PROXIMITY

SPH_RANK_MATCHANY

SPH_RANK_FIELDMASK


SetSortMode (设置排序模式)


【PHP实现方法】



SphinxClient::SetSortMode ( [排序模式],[可选的表达式] )


【描述】


【排序模式】


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


选只按相关度排序以后,会忽略后面的表达式。

其他暂略......


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


暂略......


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


暂略......


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


下面是一段实际项目中的代码:


暂略......


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


可以指定一个类似SQL的排序表达式,使用asc和desc两个关键字,但涉及的属性(属性应该和其他部分提到的字段同义)不能超过5个

属性分为内部属性(必须用@开头)和用户自定义属性,内部属性一般是有特定名称的。


已知的内部属性有:

@id (匹配文档的 ID)
@weight (匹配权值)
@rank (等同 weight)
@relevance (等同 weight)
@random (随机顺序返回结果)


所以,在PHP中使用该模式时的例子(但一般用的是自定义属性):

SphinxClient::SetSortMode(SPH_SORT_EXTENDED, "@relevance DESC, price ASC, @id DESC")


SPH_SORT_EXPR:按某个算术表达式排序


暂略......


SetWeights (设置权重)


建议使用新的SetFieldWeights 方法。


SetFieldWeights (设置字段权重)


【PHP实现方法】



SphinxClient::SetFieldWeights ( [特定规则数组] )



【描述】


用于设置不同字段命中的权重


【详解】


参数中的用的数组格式例子(命中indestry字段一次权重+1,命中area字段一次权重+2):

SphinxClient::SetFieldWeights (array("industry" => 1, "area" => 2))


SetIndexWeights (设置索引权重)



【PHP实现方法】


SphinxClient::SetIndexWeights ( [特定规则数组] )


【描述】


用于设置不同索引命中的权重


【详解】


参数中的用的数组格式例子:
SphinxClient::SetFieldWeights (array("index1" => 100, "index2" => 10))

注意:设置的索引权重该值是用来相乘的???



结果集过滤设置



SetIDRange (设置查询ID范围)



SetFilter (设置属性过滤)


【PHP实现方法】


SphinxClient::SetFilter ( [属性],[属性值数组],[过滤模式] )


【描述】


用于设置查询的进一步过滤,只能设置确定的值

说一下过滤模式,默认值是FALSE,即符合设置的属性值数组的情况时,只显示符合的数据。如果设置为TRUE,就拒绝符合设置的属性值数组的数据,显示过滤后的数据。


【例子】


从整个查询中,只接受 u_id 属性的值为 1438178 的数据:

SphinxClient::SetFilter("u_id", array("1438178"))



从整个查询中,只接受 u_id 属性的值为 1438178 或 1438179 的数据:

SphinxClient::SetFilter("u_id", array("1438178", "1438179"))



从整个查询中,只接受u_id 属性的值为 1438178 并且 iid 属性值为 8521515 的数据

SphinxClient::SetFilter("u_id", array("1438178"))

SphinxClient::SetFilter("iid", array("8521515"))


SetFilterRange (设置属性范围)


【PHP实现方法】



SphinxClient::SetFilterRange ( [属性],[最小值],[最大值],[过滤模式] )



【描述】


用于设置查询的进一步过滤,设置属性范围值

过滤模式同SetFilter。


SetFilterFloatRange (设置浮点数范围)



SetGeoAnchor (设置地表距离锚点)



分组设置





SetGroupBy (设置分组的属性)



SetGroupDistinct (设置分组计算不同值的属性)



搜索数据



Query (查询)



AddQuery (增加批量查询)



RunQueries (执行批量查询)



ResetFilters (清除当前设置的过滤器)


ResetGroupBy (清除现有的分组设置)



附加方法




BuildExcerpts (产生文本摘要和高亮)



UpdateAttributes (更新属性)


【PHP实现方法】




SphinxClient::UpdateAttributes ( [索引名(一个或多个)],[属性(一个或多个)],[新属性值(一个或多个,和属性数目对应)])


【描述】



立即更新指定索引里面的,指定文档的属性值。更新以后并未实际更新索引,而是存到内存中,当searchd干净关闭时会被写入磁盘(即实际更新索引)。

需要在docinfo=extern策略下才可运行。


例子:

$Sphinx->UpdateAttributes("subinfo2010new3", array("state"), array(8797679 => array(30)));

上面例子表示,更新 subinfo2010new3 索引的, 文档id(主键)为 8797679 的 属性 state 的值为 30。



BuildKeywords (获取分词结果)



EscapeString (转义特殊字符)



Status (查询服务状态)


持久链接



Open (打开连接)


Close (关闭连接)

文章分类
联系我们
联系人: Mr.Chen
QQ: 185391277