sphinx中文检索引擎coreseek+php+mysql搭建
coreseek下载
官网地址:
- Windows参考:http://www.coreseek.cn/products-install/install_on_windows/
- 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_string
与sql_field_string
的区别 sql_attr_string
字符串属性(可返回原始文本信息) sql_field_string
字符串字段(可全文检索,可返回原始文本信息)
推荐阅读
-
sphinx中文检索引擎coreseek+php+mysql搭建
-
使用Coreseek-4.1快速搭建Sphinx中文分词 Php-Mysql 全文检索 搜
-
coreseek 开源中文检索引擎
-
站内搜索引擎初探:haystack全文检索,whoosh搜索引擎,jieba中文分词
-
CoreSeek(全文检索引擎 Sphinx 中文版)安装使用指南(CentOS6.5)
-
sphinx中文全文检索的实现_PHP教程
-
【原创】用coreseek快速搭建sphinx中文分词搜索引擎
-
Sphinx在windows下安装使用[支持中文全文检索]
-
Coreseek + Sphinx + Mysql + PHP构建中文检索引擎
-
Sphinx在windows下安装使用[支持中文全文检索]_PHP教程