支持中文的 coreseek/sphinx 在window下的安装和使用

 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户可以免费下载使用;同时针对有实际需要的客户,我们还提供专业的搜索技术与本地化的Sphinx技术支持服务(客户中,记录量最大已超过30亿条,文本容量最大已超过5TB)。

1. coreseek的下载

   官方下载地址: http://www.coreseek.cn/products-install/install_on_windows/, 这里我直接上传了一个coreseek-4.1的版本,如果不想去官方下, 就直接下我这个

coreseek-4.1-win32.zip


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());



本文链接:http://www.likelys.com/article/10530 posted @ 2015-09-02 11:57:04
top