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

来源:互联网 发布:画册设计软件 编辑:程序博客网 时间:2024/05/13 13:56

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 0
原创粉丝点击