sphinx 使用

560 阅读1分钟

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 
}