Coreseek介绍:Sphinx默认不支持中文索引及检索,基于Sphinx开发了Coreseek 全文检索服务器,Coreseek应该是现在用的最多的Sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词


1、首先现在并且安装coreseek安装包

(1)、下载中文分词包
      http://www.coreseek.cn  到官网去下载Coreseek相应的版本

(2)、解压安装
      #cd /lamp
      #tar -zxvf coreseek-3.2.14.tar.gz
      //进入到mmseg所在文件夹,先安装中文分词mmseg
      #cd /lamp/coreseek-3.2.14/mmseg-3.2.14/
      #./configure --prefix=/usr/local/mmseg
     
     
      编译过程中报了一个config.status: error: cannot find input file: src/Makefile.in
      这个的错误,然后运行下列指令再次编译就能通过了:
     //真正的解决办法
     #aclocal
     #libtoolize --force
     #automake --add-missing
     #autoconf
     #autoheader
     #make clean


      #automake


     然后再进行编译和安装:
      #./configure --prefix=/usr/local/mmseg
      #make && make install

     然后运行mmseg,就能输入安装成功的信息了:
      #/usr/local/mmseg/bin/mmseg 
     出现下列信息,就证明mmseg中文分词已经安装好了。

2、接下来,我们要把Sphinx和mmseg结合起来 , 并且配置好配置文件
    (1)、检测安装
     进入coreseek目录,进行安装
      #cd /lamp/coreseek-3.2.14/csft-3.2.14/
      #./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/
      #make && make install

    (2)、配置带有中文分词的sphinx配置文件
     配置文件和上面的步骤一样,只不过是在coreseek中,有几个地方需要注意。
     注意:coreseek中得配置文件也是csft.conf,而不是sphinx.conf
      #cd  /usr/local/coreseek/etc
      #cp  sphinx.conf.dist csft.conf

     配置csft.conf , 配置过程中 ,没提到的东西默认 , 提到的但是不存在的则追加
      #vim csft.conf
      #主数据源
      source src1
      {       
          type = mysql                         #数据库类型
          sql_host = localhost                        # MySQL主机IP
          sql_user = root                            # MySQL用户名
          sql_pass = 123                         # MySQL密码
          sql_db   =  test                    # MySQL数据库
          sql_port = 3306                         # MySQL端口
          sql_sock = /tmp/mysql.sock               #如果是linux下需要开启,指定sock文件
          sql_query_pre = SET NAMES UTF8     # MySQL检索编码
          sql_query    = \                        #获取数据的SQL语句    
          SELECT id, title, content FROM post
          #sql_attr_uint = group_id                #对排序字段进行注释
          #sql_attr_timestamp = date_added         #对排序字段进行注释
          sql_query_info= SELECT * FROM post WHERE id=$id

          #这里这一句是用来添加查询的属性的 , 可以通过php的操作函数
          #UpdateAttributes对查询数据进行更新
          sql_attr_multi  = uint status from field status;
      }

      #这行暂时不需要修改
      source srclthrottled:srcl                   #继承主数据源
      #主数据源索引:
      index test1
      {     
          source = src1                        #索引源声明
          #stopwords            = G:\data\stopwords.txt
          #wordforms            = G:\data\wordforms.txt
          #exceptions            = /data/exceptions.txt
          #添加下面这两行,意思是把中文分词加入到配置文件中
          charset_type        = zh_cn.utf-8
          charset_dictpath     = /usr/local/mmseg/etc/    #你安装mmseg的目录
       }   #增量索引
      #index testlstemmed:test1           #先进行注释
      #index distl                          #分布式也注释掉

     (3)、生成索引并且测试
      #/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf “test1”
      //测试
      #/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft.conf “测试查询内容”

      #/usr/local/coreseek/bin/indexer -c etc/csft.conf --all
     错误信息 :/usr/local/coreseek/bin/indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory

     解决办法 :

          #vim /etc/ld.so.conf
          #加入内容
          /usr/local/mysql/lib
          #ldconfig-v

3、建立sphinx实施索引(包含增量索引)
      数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到“主索引+增量索引”的思路来解决,这个模式实现的基本原理是设置两个数据源和两个索引。
     (1)、创建一个计数器
       一个简单的实现是,在数据库中增加一个计数表,记录将文档集分为两个部分的文档 ID,每次重新构建主索引时,更新这个表
      先在 mysql 中插入一个计数表
          mysql> CREATE TABLE sph_counter( counter_id INTEGER PRIMARY KEY NOT NULL,    max_doc_id INTEGER NOT NULL); 
          //插入一条数据
          mysql>INSERT INTO sph_counter (`id`, ` max_doc_id `) VALUES ('1', '0');  


      (2)、再次修改配置文件
       主数据源,继承数据源,主索引,继承索引。(继承索引也就是增量索引)。
       主数据源里面:我们需要把欲查询语句改成下面的语句:
        #vi /usr/local/coreseek/etc/csft.conf

        Source src1{
            #添加一句sql_query_pre , 并且修改sql_query
            #这里的sql_query_pre是每一次更新的时候时都同时更新计时器
            sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM post
            #这里是读取在计时器之前更新的数据 , 也是老数据
            sql_query=    \
            SELECT id,title, content FROM post \
            WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
        }
        #继承数据源:
        source src1Add : src1
        {
            sql_query_pre = SET NAMES utf8
            #这里一上面数据源的相反 , 主要是读取新数据,也是增量数据,所以id是取大于计时器的
            sql_query = \
            SELECT id,title, content FROM post \
            WHERE id>(SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
        }
        #主索引:
        Index test1 {
            source  = src1
            path = /usr/local/coreseek/var/data/src1
        }
        #继承索引(也是增量索引)
        index test1Add:test1
        {
            source= src1Add
            path= /usr/local/coreseek/var/data/test1Add
        }
        剩下的基本不用改变
       注意:如果你增量索引的 source 配置中只有 id,content 三项而主索引的 source 配置中有 id, title,content 四项,合并的时候会报属性数量不匹配,如:
       Delta:sql_query = SELECT id, title,content FROM post
       Main:sql_query=SELECT id,title,date,content FROM post
     (3)、测试增量索引+主索引
      //如果想测试增量索引是否成功,往数据库表中插入数据,查找是否能够检索到,这个时候检索应该为空,然后,单独重建增量索引
      //先把新插入的数据添加到增量索引中
      #/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf  test1Add
      //查看新的数据是否已经在增量索引中
      #/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft.conf “查询数据”
      //将增量索引更新到主索引中
      #/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf  test1
      //查看新的数据是否已经在主索引中
      #/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft.conf “查询数据”
      //如果成功此时,再用/usr/local/coreseek/bin/search 工具来检索,能够看到,在主索引中检索到的结果为 0,而在增量中检索到结果。当然,前提条件是,检索的词,只在后来插入的数据中存在

      (4)、实时更新索引
       我们需要建立两个脚本,还要用到计划任务
       建立一个主索引和增量索引的脚本

       test1.sh //更新主索引脚本 

       test1Add.sh //更新增量索引脚本

       在增量索引中写下test1Add.sh
        #cd /usr/local/coreseek/etc
        #vim test1Add.sh
        #!/bin/bash
        /usr/local/coreseek/bin/indexer test1Add -c /usr/local/coreseek /dict/csft_mysql.conf >>/usr/local/coreseek/var/log/test1Add.log --rotate

        主索引中写下:test1.sh意思就是合并索引
        #vim test1.sh
        #!/bin/bash
        /usr/local/coreseek/bin/indexer --merge  -c /usr/local/coreseek/dict/csft_mysql.conf  >>/usr/local/coreseek/var/log/test1.log --rotate

        编写好了之后 ,更改脚本权限:
        #chmod a+x test1Add.sh
        #chmod a+x test1.sh

       最后,我们需要脚本能够自动运行,以实现增量索引每5分钟重新建立,和主索引只在凌晨2:30时重新建立.
       脚本写好了,我们需要建立计划任务
        #crontab -e
        */5 * * * *  /usr/local/coreseek/etc/test1Add.sh
        30 2 * * *  /usr/local/coreseek/etc/test1.sh         

        第一条是表示每5分钟运行      

        第二条是表示每天的凌晨2:30分运行

        要验证的话,我们可以查看日志文件
4、最终要开启php的话需要开启searchd服务 , 监听的端口是9312
        #/usr/local/coreseek/bin/searchd –c /usr/local/coreseek/etc/csft.conf

版权声明:未经博主允许不得转载。http://smister.com/post-9.html