支持中文的 coreseek/sphinx 在window下的安装和使用
Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户可以免费下载使用;同时针对有实际需要的客户,我们还提供专业的搜索技术与本地化的Sphinx技术支持服务(客户中,记录量最大已超过30亿条,文本容量最大已超过5TB)。
1. coreseek的下载
官方下载地址: http://www.coreseek.cn/products-install/install_on_windows/, 这里我直接上传了一个coreseek-4.1的版本,如果不想去官方下, 就直接下我这个
2. 解压
将下载好的压缩包解压到一个目录, 这里就暂时解压到d盘下, 放了方便管理,在d盘下新建一个sphinx的文件夹,将解压出来的文件全放到sphinx中, 现在进入d:/sphinx应该能看到
d:/sphinx/api
d:/sphinx/bin
d:/sphinx/etc
d:/sphinx/var
等等...
3. 准备数据表
打开mysql, 新建一个sphinx_test的数据库(库名自定义,需utf-8编码),在sphinx_test里面添加2个数据表,表t_counter用来记录本次造索引数据的最大ID,方便接下来做增量时只需要查询出大于最大ID的数据即可
CREATE TABLE `t_counter` ( `typeid` int(11) NOT NULL, `maxid` int(11) NOT NULL, `updatetime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (`typeid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用于sphinx增量索引的数据源'; CREATE TABLE `t_sphinx_content` ( `id` int(11) NOT NULL auto_increment, `topicid` int(11) NOT NULL default '0', `channelid` int(11) NOT NULL default '0', `updatetime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `title` varchar(256) NOT NULL default '', `content` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='sphinx搜索主内容'; ## 插入3条测试数据 INSERT INTO `t_sphinx_content` VALUES ('1', '110', '1', '2015-08-18 14:31:03', 'sphinx配置文件详解', 'sphinx的配置:其结构组成主要如下:Source 源名称'); INSERT INTO `t_sphinx_content` VALUES ('2', '111', '2', '2015-08-18 15:12:23', 'sphinx 配置文件全解析', 'sphinx的配置文件是在配置的时候最容易出错的了: 我们先要明白几个概念: source...# xmlpipe_fixup_utf8 = 1 } ## sphinx的source是有继承这么一种属性的.'); INSERT INTO `t_sphinx_content` VALUES ('3', '112', '3', '2015-08-18 15:15:10', 'sphinx结合MySQL 环境配置与应用', ' sphinx和MySQL在win上的配置与应用 sphinx在win上的安装 本例子目前还不支持中文...SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added');
4. 修改配置(*)
之所以加个星号,是表示这一步才是最最关键的步骤. 首先找到配置文件的目录,d:/sphinx/etc下面,conf后缀的即时我们要修改的,当然不是全部conf文件都修改, 这里就修改一个文件即可, 我们就拿csft.conf文件来参考修改. 把下面内容覆盖到csft.conf中
############################配置开始######################################## #MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/ #请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库 # 数据源的数据库配置 source mysql { # 这下面的配置就是上一步数据库的信息 type = mysql sql_host = localhost sql_user = root sql_pass = root sql_db = sphinx_test sql_port = 3306 } # 主索引数据源(数据源名自定义) source main_source : mysql { sql_query_pre = SET NAMES utf8 #记录本次数据源的最大ID sql_query_pre = replace into t_counter (typeid,maxid) select 1,max(id) from t_sphinx_content # 字符串字段title,content将会是全文索引的内容 sql_query = select id,topicid,channelid,unix_timestamp(updatetime) as updatetime,title,content from t_sphinx_content # 查询返回的字段 sql_attr_uint = topicid sql_attr_uint = channelid sql_attr_timestamp = updatetime #sql_query_info_pre= SET NAMES utf8 #命令行查询时,设置正确的字符集 #sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息 } # 增量数据源(数据源名自定义) source delta_source : mysql { sql_query_pre = SET NAMES utf8 # 根据上次maxid,查出>maxid的数据做增量索引 sql_query = select id,topicid,channelid,unix_timestamp(updatetime) as updatetime,title,content from t_sphinx_content where id > ifnull((select maxid from t_counter where typeid=1),0) # 查询返回的字段 sql_attr_uint = topicid sql_attr_uint = channelid sql_attr_timestamp = updatetime #sql_query_info_pre= SET NAMES utf8 #命令行查询时,设置正确的字符集 #sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息 } # 主索引(索引名自定义) index main_index { # 对应的source名称 source = main_source # 请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... path = d:/sphinx/data/main_index/ docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 # 中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ # Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... charset_dictpath = d:/sphinx/etc/ charset_type = zh_cn.utf-8 } # 增量索引(索引名自定义) index delta_index { # 对应的source名称 source = delta_source path = d:/sphinx/data/delta_index/ docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 # 中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ # Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... charset_dictpath = d:/sphinx/etc/ charset_type = zh_cn.utf-8 } #全局index定义 indexer { mem_limit = 128M } #searchd服务定义,这个节点基本不用修改 searchd { listen = 9312 read_timeout = 5 max_children = 30 max_matches = 1000 #seamless_rotate = 0 preopen_indexes = 0 unlink_old = 1 # 请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... pid_file = d:/sphinx/log/searchd_mysql.pid # 请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... log = d:/sphinx/log/searchd_mysql.log # 请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... query_log = d:/sphinx/log/query_mysql.log # binlog日志 binlog_path = d:/sphinx/binlog } ############################配置结束########################################
配置文件中有各个属性以及模块的说明,这里再重申两点(也是配置文件一般需要修改的部分):
source:数据源,数据是从什么地方来的。
index:索引,当有数据源之后,从数据源处构建索引。索引实际上就是相当于一个字典检索。有了整本字典内容以后,才会有字典检索。
细心的你就会发现,配置文件中有好多"目录"型的字符串值,必须index节点里面的path,searchd节点里面的pid_file等. 这里我们需要手动把这些文件的所属目录给创建好.
上面给出的配置文件需要手动创建的目录有
d:/sphinx/data/main_index/ (main_index主索引文件存储目录)
d:/sphinx/data/delta_index/ (delta_index增量索引存储目录)
d:/sphinx/log/
d:/sphinx/binlog/
当然你看上面目录不爽的话也可以自定义目录,但需知道的是要手动(不存在的话)创建目录,sphinx不会帮你建
5. 创建主索引(main_index)(*)
1)打开dos,进入sphinx所在的bin目录(d:/sphinx/bin)
2)执行: d:\sphinx\bin> indexer main_index -c d:\sphinx\etc\csft.conf
6. dos下尝试全文搜索
1)执行: d:\sphinx\bin> search sphinx -c d:\sphinx\etc\csft.conf 其中search后面跟的sphinx是搜索的关键字,如要搜索abc将sphinx换成abc即可
2)上图中标红的即时返回的关键结果, 这时你可以打开刚才建好的表(t_sphinx_content)看看,topicid和channelid是不是正确的
7. 创建Window服务(*)
1)为什么要创建服务呢? 这是为了方便php/java等API的调用,API是通过这个服务来进行全文搜索的
2)什么叫服务呢, 百度百科上的专业解释是: 使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。
3)执行: d:\sphinx\bin> searchd.exe --install --config d:\sphinx\etc\csft.conf --servicename Sphinx
4)启动服务,执行: d:\sphinx\bin> net start Sphinx
5)停止服务则执行: d:\sphinx\bin> net stop Sphinx
8. 增量索引以及合并到主索引(*)
1)上述配置文件中是有对增量索引(delta_index)进行配置的,那什么叫增量索引呢? 通俗点讲就是:
A表本来有索引a,b , 现A表更新了,增加了c列,然后用程序自动的给c列加索引,这叫增量索引, 是不是很有用!
做增量索引之前我们需要往数据表里面再插入一个测试数据
INSERT INTO `t_sphinx_content` VALUES ('4', '113', '4', '2015-08-18 15:31:10', '索引合并', '合并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“\r\n主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引\r\n对应的数据)。因此indexer有这个选项。合并索引一般比重新索引快,但在大型索引上仍\r\n然不是一蹴而就。基本上,待合并的两个索引都会被读入内存一次,而合并后的内容需要写\r\n入磁盘一次。例如,合并100GB和1GB的两个索引将导致202GB的IO操作(但很可能还\r\n是比重新索引少)\r\n基本的命令语法如下:\r\nindexer --merge DSTINDEX SRCINDEX [--rotate]');
2)给增量数据创建索引,执行: d:\sphinx\bin> indexer delta_index -c d:\sphinx\etc\csft.conf --rotate
细心的话你会发现这行命令后面怎么多了一个"--rotate",是因为如果delta_index索引已经被searchd用于提供服务,则"--rotate"必须加上,否则会报错.简单点说,如果服务是开启的, 则需要加这个参数,如果不是则可以省去!
3)索引合并(增量索引合并到主索引中),先介绍下索引合并的语法:
基本的命令语法如下:
indexer --merge DSTINDEX SRCINDEX [--rotate]
SRCINDEX的内容被合并到DSTINDEX中,因此只有DSTINDEX索引会被改变。
了解了语法,我们在这里只需要执行:
d:\sphinx\bin> indexer --merge main_index delta_index -c d:\sphinx\etc\csft.conf --rotate
9. 如何在php里面调用API
api文件目录在D:\sphinx\api\sphinxapi.php
<?php header ( "Content-type:text/html;charset=utf-8" ); //api文件目录在D:\sphinx\api\sphinxapi.php require ( "sphinxapi.php" ); function hprint( $data , $exit = null) { echo '<pre>' ; print_r ( $data ); echo '</pre>' ; $exit && exit (); } $config = array ( 'host' => '127.0.0.1' , 'port' => 9312, //端口 'match_mode' => SPH_MATCH_ANY, //匹配模式 匹配任意 'sort' => SPH_SORT_RELEVANCE, //排序模式 按相关度排 'timeout' => 300, //超时 'debug' => false, //是否为调试模式 ); //Sphinx 搜索引擎配置 $is_debug = $config [ 'debug' ]; $client = new SphinxClient(); $client ->SetServer( $config [ 'host' ], $config [ 'port' ]); # $client ->SetFieldWeights( array ( 'title' =>7, 'content' =>3)); //第一个参数就是搜索的关键字 $result = $client ->Query( '' , 'main_index' ); hprint( $result ); //打印出错误 hprint( $client ->GetLastError());