sphinx 使用
1、使用规范
<?php
$maxSize = 5000; //最大查询数量限制
$port = 9312;
$source = "impressionSuite";
vendor('CoreSeek.SphinxApi');
$s = new \SphinxApi;
$s->setServer($sphinxHost, $port);
$s->setArrayResult(true);
$s->setMatchMode(SPH_MATCH_ANY); //SPH_MATCH_ANY SPH_MATCH_EXTENDED2
$s->SetRankingMode(SPH_RANK_MATCHANY);
$s->setMaxQueryTime(30);
$s->SetLimits(($page - 1) * $pageSize, $pageSize,$maxSize);
$res = $s->query($row['multi_name'], $source);
2、主要方法和注意事项
①setMatchMode //匹配模式
SPH_MATCH_ALL 匹配所有查询词(默认模式).
SPH_MATCH_ANY 匹配查询词中的任意一个.
SPH_MATCH_PHRASE 将整个查询看作一个词组,要求按顺序完整匹配.
SPH_MATCH_BOOLEAN 将查询看作一个布尔表达式.
SPH_MATCH_EXTENDED 将查询看作一个Sphinx内部查询语言的表达式.
SPH_MATCH_FULLSCAN 使用完全扫描,忽略查询词汇.
SPH_MATCH_EXTENDED2 类似 SPH_MATCH_EXTENDED ,并支持评分和权重.
②setRankingMode //排序模式
SPH_RANK_PROXIMITY 设置评分模式
SPH_RANK_PROXIMITY_BM25 默认,基于评分和 BM25 两个因素
SPH_RANK_MATCHANY 和SPH_MATCH_ANY 相对应
③setFilter(fieldName, array(value1,value2,...)); //设置过滤字段字
④SetFieldWeights //设置字段权重
$s->SetFieldWeights (array('industry'=>1,'area'=>2));//设置字段的权重,如果area
命中,那么权重算2
⑤setSortMode //设置排序
SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)
SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)
SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)
SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序
SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。
SPH_SORT_EXPR 模式,按某个算术表达式排序。
⑥SetLimits //设置分页
$s->SetLimits(($page - 1) * $pageSize, $pageSize,$maxSize); //$maxSize 不能超过max_matches
3、按照字段命中计算权重 排序
$s->SetRankingMode ( SPH_RANK_PROXIMITY );//设置评分模式
$s->SetMatchMode ( SPH_MATCH_EXTENDED );//设置模式
$s->SetRankingMode ( SPH_RANK_PROXIMITY );//设置评分模式
$s->SetFieldWeights (array('industry'=>1,'area'=>2,'expr'=>2));//设置字段的权重,如果area命中,那么权重算2
$s->SetSortMode ('SPH_SORT_EXPR','@weight');//按照权重排序
4、配置项说明
source question
{
type = mysql
sql_host = 10.10.1.150
sql_user = dev_dba
sql_pass =db_pass
sql_db = db_name
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8
sql_query = \
SELECT * FROM t_wenda_question order by add_time desc
sql_field_string = title #设置字段属性
}
#impressionSuite 继承question公共配置
source impressionSuite : question
{
sql_query = \
SELECT id,title FROM t_impression_suite where state=4 order by id desc
sql_attr_uint = id
sql_query_info = SELECT * FROM t_impression_suite WHERE id=$id
}
index question
{
source = question
path = /usr/local/coreseek-4.1/var/data/question
docinfo = extern
charset_dictpath = /usr/local/mmseg_3.2.14/etc
charset_type = zh_cn.utf-8
ngram_len = 0
}
#impressionSuite 继承question公共配置
index impressionSuite : question
{
source = impressionSuite
path = /usr/local/coreseek-4.1/var/data/impressionSuite
}