sphinx中文检索引擎coreseek+php+mysql搭建

coreseek下载

官网地址:

  1. Windows参考:http://www.coreseek.cn/products-install/install_on_windows/
  2. Linux参考:http://www.coreseek.cn/products-install/install_on_bsd_linux/
    :注意根据自己的环境配置选择合适的版本下载

安装

将安装包解压到自己环境的项目目录文件夹下,本例中为 E:\www\coreseek 中,在Windows环境下配置

配置步骤

1)数据(本例中使用mysql作为数据源)
2)建立 sphinx 配置文件
3)生成索引文件
4)启动 sphinx 服务
5)使用(调用api或search.exe程序进行查询)

建立sphinx配置文件

配置文件: etc/csft_mysql.conf
1)数据源定义

#源定义
#文章
source article
{
    type                    = mysql
    sql_host                = 127.0.0.1
    sql_user                = root
    sql_pass                = 123
    sql_db                  = test
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM np_article      #增量id查询
    sql_query               = SELECT id*100+1 AS id, id AS contentid, title, intro, content, thumb, collect, hit, UNIX_TIMESTAMP(created_at) as created_at FROM article WHERE (deleted_at is null and id <= (SELECT max_doc_id FROM sph_counter WHERE counter_id = 1))
                                                #sql_query第一列id需为整数
                                                #title、content作为字符串/文本字段,被全文索引
    sql_attr_uint           = contentid               #从SQL读取到的值必须为整数,该字段会被保存到查询结果中        
    sql_attr_uint           = collect
    sql_attr_uint           = hit

    sql_field_string = title #字符串类型字段,将被保存到结果集中
    sql_field_string = intro
    sql_field_string = content
    sql_field_string = thumb

    sql_attr_timestamp = created_at #unix时间戳
    sql_query_info_pre      = SET NAMES utf8    #命令行查询时,设置正确的字符集
    #sql_query_info          = SELECT * FROM article WHERE id=$id #命令行查询时,从数据库读取原始数据信息
}

2)索引配置

#index定义
index article
{
    source            = article             #对应的source名称
    path              = E:/www/coreseek/coreseek-4.1-win32/var/data/test/article
                                          #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    docinfo           = extern
    mlock             = 0
    morphology        = none
    min_word_len      = 1   #最小索引词长度。可选选项,默认为1(索引任何词) 
    html_strip        = 1   #是否从输入全文数据中去除HTML标记。可选标记,默认为0。已知值包括0(禁用)和1(启用)。
    min_infix_len     = 1    #索引的最小中缀长度。可选选项,默认为0(不索引中缀)。
    infix_fields      = title   #做中缀索引的字段列表。可选选项,默认为空(所有字段均为中缀索引模式)。

    #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
    #charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
    charset_dictpath = E:/www/coreseek/coreseek-4.1-win32/etc/     
                                      #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
    charset_type      = zh_cn.utf-8
}

3)indexer程序配置

#全局index定义
indexer
{
    mem_limit            = 128M
}

4)服务器定义

#searchd服务定义
searchd
{
    listen              = 9312
    read_timeout        = 5
    max_children        = 30
    max_matches         = 1000
    seamless_rotate     = 0
    preopen_indexes     = 0
    unlink_old          = 1
    pid_file = E:/www/coreseek/coreseek-4.1-win32/var/log/searchd_mysql.pid  
                                       #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    log = E:/www/coreseek/coreseek-4.1-win32/var/log/searchd_mysql.log        
                                       #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    query_log = E:/www/coreseek/coreseek-4.1-win32/var/log/query_mysql.log 
                                       #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
    binlog_path =                      #关闭binlog日志
    compat_sphinxql_magics = 0
}

生成索引

1)生成全部索引
E:\www\coreseek\coreseek-4.1-win32\bin>indexer.exe –config E:\www\coreseek\coreseek-4.1-win32\etc\csft_mysql.conf –all
: –all 指生成全部索引

2)生成指定索引
E:\www\coreseek\coreseek-4.1-win32\bin>indexer.exe –config E:\www\coreseek\coreseek-4.1-win32\etc\csft_mysql.conf article
: article 为配置文件中的索引名

索引更新

对于后期插入的新数据更新索引,使用增量索引
参考文档:http://blog.csdn.net/liushuai_andy/article/details/9138455
http://blog.csdn.net/liushuai_andy/article/details/9366777
思路
1、设置两个数据源和两个索引,一个主索引,一个增量索引,数据库中建立一个计数表,记录已经建完索引的最大ID
2、增量索引,在配置文件中,定义sql 时添加条件,大于表中id值;主索引,在配置文件中,定义sql 时添加条件,小于表中id值
3、每隔几分钟执行增量索引,执行后更新计数表中最大id,合并增量索引和主索引;每隔一天或几天,执行一次主索引

本例操作如下
1)增量索引源定义

#文章增量索引
source article_step:article
{
    sql_ranged_throttle = 100
    sql_query_pre            = SET NAMES utf8
    sql_query_pre = SET SESSION query_cache_type=OFF

    sql_query                = SELECT id*100+1 AS id, id AS contentid, title, intro, content, thumb, type_id, collect, hit, UNIX_TIMESTAMP(created_at) as created_at FROM article WHERE (deleted_at is null and id > ( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )) 

    sql_attr_uint           = contentid               #从SQL读取到的值必须为整数

    sql_attr_uint           = collect
    sql_attr_uint           = hit

    sql_field_string = title
    sql_field_string = intro
    sql_field_string = content
    sql_field_string = thumb

    sql_attr_timestamp = created_at

    sql_query_info_pre      = SET NAMES utf8         
}

2)增量索引

#文章增量索引
index article_step:article
{
    source            = article_step            #对应的source名称
    path = E:/www/coreseek/coreseek-4.1-win32/var/data/test/article_step
}

启动服务

命令行,启动服务,必须打开控制台,php才能连到sphinx,并一直开启具体命令如下:

E:\www\coreseek\coreseek-4.1-win32\bin>searchd.exe –c E:\www\coreseek\coreseek-4.1-win32\etc\csft_mysql.conf

调用查询

1)使用步骤
在php中引入coreseek/api目录下的sphinxapi.php文件,该文件包含一个SphinxClient的类

$sAppPath = app_path();
require_once ( $sAppPath.'/extends/sphinx/sphinxapi.php' );
$oSphinx = new SphinxClient ();
//sphinx 生成索引文件所在服务器域名与端口
$oSphinx->SetServer ( '127.0.0.1', '9312');
//匹配结果的偏移量,参数分别为:起始位置,返回结果条数,最大匹配条数
$oSphinx->SetLimits($iOffset, $iPageSize, $iMaxReturn);
//最大搜索时间
$oSphinx->SetMaxQueryTime(1000);
$sRes = $oSphinx->Query($sKeyWorlds, '*' );
//echo '<pre>';
//print_r($sRes);
//echo '</pre>';


$sRes是一个数组,返回数组结构如下

array (size=8)
  'error' => string '' (length=0)
  'warning' => string '' (length=0)
  'status' => int 0
  'fields' => 
    array (size=4)
      0 => string 'title' (length=5)
      1 => string 'intro' (length=5)
      2 => string 'content' (length=7)
      3 => string 'thumb' (length=5)
  'attrs' => 
    array (size=8)
      'contentid' => int 1
      'title' => int 7
      'intro' => int 7
      'content' => int 7
      'thumb' => int 7
      'collect' => int 1
      'hit' => int 1
      'created_at' => int 2
  'total' => string '0' (length=1)
  'total_found' => string '0' (length=1)
  'time' => string '0.000' (length=5)

total是匹配到的数据总数量
matches是匹配的数据,包含 id,attr 这些信息
words 是检索关键字的分词

2)类似 mysql 条件的用法

//属性过滤,可过滤的属性必须在配置文件中设置sql_attr_ 
sql_attr_uint = id //定义int类型属性,该字段会被保存到结果集中
sql_attr_timestamp = created_at//定义时间类型属性
//如果再次修改这些属性,需要重新生成索引才能生效

//指定一些值:第一个参数为指定的字段,第二个参数为该字段的值,第三个参数为true时,表示不包含该值
$oSphinx->SetFilter('contentid', array($iId));
$oSphinx->SetFilter('contentid', array($iId), true);
//指定一个值的范围:第一个参数表判断的字段,第二、三个参数表范围,第四个参数为true时,表示不包含该范围
$oSphinx->SetFilterRange('contentid', 1, 10);

3)排序
SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)

SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面),需要设置一个属性名

SPH_SORT_ATTR_ASC模式, 按属性升序排列(属性值越小的越是排在前面),需要设置一个属性名SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序,需要设置一个属性名

SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。
$oSphinx->SetSortMode ( SPH_SORT_ATTR_DESC, "hit" );

:内置属性需要加@,可用的内置属性如下
–@id(匹配文档的ID)
–@weight(匹配权值)
–@rank (等同weight)
–@relevance(等同weight)
–@random(随机顺序返回结果)

SPH_SORT_EXPR 模式,按某个算术表达式排序

4)匹配模式
SPH_MATCH_ALL, 匹配所有查询词(默认模式);
SPH_MATCH_ANY, 匹配查询词中的任意一个;
SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配;
SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式
SPH_MATCH_EXTENDED, 将查询看作一个CoreSeek/Sphinx内部查询语言的表达式 . 从版本Coreseek 3/Sphinx 0.9.9开始, 这个选项被选项SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容——这样即使Sphinx及其组件包括API升级的时候,旧的应用程序代码还能够继续工作。
SPH_MATCH_EXTENDED2, 使用第二版的“扩展匹配模式”对查询进行匹配.
SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生.
我们要关注的主要是SPH_MATCH_EXTENDED2扩展匹配模式,扩展匹配模式允许使用一些像mysql的条件语句
$oSphinx->SetMatchMode ( SPH_MATCH_ANY);//模糊匹配
$oSphinx->SetMatchMode ( SPH_MATCH_ALL);//精确匹配

检索返回字段问题

需要返回文本字段,可以在配置文件中定义:

sql_field_string =title
sql_field_string =content

sql_attr_stringsql_field_string的区别
sql_attr_string 字符串属性(可返回原始文本信息)
sql_field_string字符串字段(可全文检索,可返回原始文本信息)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值