• Ubuntu上Coreseek+PHP的安装


    Coreseek是一个基于sphinx引擎,支持与mmseg中文分词模块合作完成中文的全文搜索引擎。相对sql这类操作,Coreseek负载可谓是微不足道。当然类似的索引服务器还有给予Java的solr等。我选择coreseek的主要原因之一是他可以通过配置后可以与现有的mysql客户端兼容,并可以直接嵌入到mysql中成为mysql的引擎之一。

    首先,下载安装包,我选择的是最新的stable版, 不过不客气的说,即便是coreseek的stable版本,不论是从稳定性、兼容性还是灵活性上都不能算是完善,至少无法跟apache这类经典应用相提并论。

    安装Ubuntu开发包:
    apt-get install make gcc g++ automake libtool mysql-client libmysqlclient15-dev libxml2-dev libexpat1-dev

    解压:
    tar xzvf coreseek-3.2.14.tar.gz
    cd coreseek-3.2.14

    应该看到有mmseg csft testpack 至少3个目录

    安装mmseg中文分词模块

    cd mmseg-3.2.14
    ./bootstrap
    ./configure –prefix=/usr/local/mmseg3 #不喜欢这个官方目录配置,更换目录后配置无法生效郁闷了很久,稍后再说
    make
    make install
    cd ../testpack
    /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml #测试结果,请确保终端可以看到utf8中文,应该可以看到分词后的结果

    安装Python包

    虽然coreseek支持直接的mysql连接,但考虑到分词、分表的情况,这种设置不是很灵活。我的方案是通过python脚本的预处理,将mysql的数据整理后传输到coreseek建立索引。这样还有一个优势就是“万能数据源”——memcache、redis这类几乎不指望coreseek官方支持的妖异存储方案,只要有python的api,均可以索引。

    官方的安装手册中介绍的python接口是基于ActivePython 替代系统python语言的方式进行的。ActivePython属于第三方封包,远没有系统自带python来的方便,刚开始用系统python测试了数次,均不成功,后来根据出错信息,找到了原因。

    apt-get install python-dev python-sqlite python-mysqldb python-memcache

    安装coreseek

    cd ../csft-3.2.14
    ./buildconf.sh
    ./configure –prefix=/usr/local/coreseek –without-unixodbc –with-mmseg –with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ –with-mmseg-libs=/usr/local/mmseg3/lib/ –with-mysql –with-python
    make
    make install

    cd ../testpack
    /usr/local/coreseek/bin/indexer -c etc/csft.conf –all
    /usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索 #没什么问题了

    安装libsphinxclient

    coreseek官方教程中建议php使用直接include一个php文件进行操作,事实上php有独立的sphinx模块可以直接操作coreseek (coreseek就是sphinx!)已经进入了php的官方函数库,而且效率的提升不是一点点!但php模块依赖于libsphinxclient包。

    cd ../csft-3.2.14/api/libsphinxclient
    ./configure
    make
    make install
    ldconfig

    安装php-sphinx支持

    apt-get install php5-dev
    wget http://pecl.php.net/get/sphinx-1.1.0.tgz
    tar vzxf  sphinx-1.1.0.tgz
    cd  sphinx-1.1.0
    phpize
    ./configure
    make
    make install

    确信成功后修改php.ini,还是遵从Ubuntu的配置规则
    echo “extension=sphinx.so”  > /etc/php5/conf.d/sphinx.ini

    如果使用apache或者fast-cgi的话,请重起。察看phpinfo() 如下则安装成功。

    sphinx

    sphinx supportenabled
    Version1.1.0
    Revision$Revision: 303462 $

    配置coreseek

    说容易也容易,说麻烦也麻烦的工作,照贴一份吧前面说过,我用的是python数据源

    /usr/local/coreseek/etc/coreseek.conf

    python
    {
               path = /usr/local/coreseek/DBSource #python 数据源脚本的存放路径
    }
    source Blog #索引库1 “Blog”
    {
              type = python #类型为python
              name = Blog.MainSource #调用python的class
    }
    index Blog
    {
        source          = Blog #数据源名称
        path            = /data/sphinx/Blog #数据文件存放路径
        docinfo         = extern
        mlock           = 0
        morphology      = none
        min_word_len    = 1
        html_strip      = 0
       charset_dictpath = /usr/local/mmseg3/etc/ #mmseg中文分词库的位置,本文开头时我说不能修改mmseg的安装路径就错在这里
       charset_type        = zh_cn.utf-8
    }
    source UserInfo #索引库2 “UserInfo” 其余同上
    {
        type = python
        name = UserInfo.MainSource
    }
    index UserInfo
    {
         source          = UserInfo
         path            = /data/sphinx/UserInfo
         docinfo         = extern
         mlock           = 0
        morphology      = none
        min_word_len    = 1
        html_strip      = 0
        charset_dictpath = /usr/local/mmseg3/etc/
        charset_type        = zh_cn.utf-8
    }
    searchd #服务器配置
    {
        listen          =   9312  #显而易见,默认的监听端口
        listen          =   172.18.196.90:3306:mysql41 #兼容mysql方式的监听,我们配置了php-sphinx,故除了命令行方式外意义不大,可以关闭
        pid_file        =   /var/run/coreseek.pid
    }

    配置的部分都OK了,当然可以考虑通过这里(http://www.codesky.net/Linux/2012-07/66077.htm)介绍的方法直接打包成deb或者制作rpm。

    python数据源脚本示意

    贴过来供各位参考,注意的是返回的“字段名”必须是全小写

    #!usr/bin/env python
    from DBConfig import DBConfig
    import MySQLdb

    class MainSource(object):

        def __init__(self, conf):
            self.conf=conf
            self.data=[]
            self.idx = 0
        def GetScheme(self): #数据结构
            return [
                ('id' , {'docid':True } ), #id 必须是正整数
                ('uid', { 'type':'text'} ),
                ('blogcontent', { 'type':'text'} ),
            ]

        def GetFieldOrder(self): #排序
            return [('id'),('uid')]

        def Connected(self): #链接

            self.TableList=DBConfig().getDBTableConfig("BlogContent")
            self.getTableData()
            pass

        def NextDocument(self): #指针进行下一行
            if (  len(self.data) > 0 ):
                item = self.data.pop()
                #item = self.data[self.idx]
                self.id = item["id"]
                self.uid = item["uid"]
                self.blogcontent = item["blogcontent"]
                self.idx += 1
                return True

            elif (len(self.TableList ) > 0):
                self.getTableData()
                return self.NextDocument()

            else:
                return False

        def getTableData(self):
            dConfig = self.TableList.pop()
            mysqlHandle=MySQLdb.connect(host=dConfig["host"], user=dConfig["user"],
                             passwd=dConfig["passwd"], db=dConfig["dbName"])

            sSQL="SELECT blogId, uid, blogContent FROM " + dConfig["tableName"]
            tableNumber = int(dConfig["tableName"][-2:], 16)
            mysqlCursor=mysqlHandle.cursor()

            mysqlCursor.execute(sSQL)

            lResultList=mysqlCursor.fetchall()
            mysqlHandle.close()

            lData=[]
            for lRow in lResultList:
                fullId = int (lRow[0]) * 1000 + tableNumber
                dRow={
                       "id":fullId,
                       "uid":lRow[1],
                       "blogcontent":lRow[2]
                    }
                lData.append(dRow)

            if (len(lData) > 0 ):           
                self.data.extend(lData)

    if __name__ == "__main__": 
        conf = {}
        source = MainSource(conf)
        source.Connected()

        while source.NextDocument():
            print source.blogContent
        pass开启服务器

    建立索引:
    /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf –all 正常情况下,你会在配置文件设置的/data/sphinx目录下看到有索引文件生成。 
    开启服务器:
    /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/sphinx.conf  你可以netstat -an| grep 9312 是否打开 
    设置定期更新索引:
    coreseek的索引机制决定的他必须定期例遍全表,当然可以通过修改数据源的方式实现增量索引,然后合并索引,这样更靠谱,当然为了防止伸手党,在这里暂时不做介绍。
    crontab -e
    */15 * * * * /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf –all –rotate #15分钟索引一次 

  • 相关阅读:
    mysql中标量子查询和关联子查询的性能比较
    关于mysql函数GROUP_CONCAT
    mysqldump和smbclient的简单使用
    找到自己除编码外可以做的事情
    smalldatetime和datetime的区别
    一个简单的职责链设计
    mysql中用HEX和UNHEX函数处理二进制数据的导入导出
    英语词根、词根、前缀、后缀大全
    ASP.NET编译执行常见错误及解决方法汇总之二
    ASP.NET编译执行常见错误及解决方法汇总之五(终结篇)
  • 原文地址:https://www.cnblogs.com/j-king/p/3641529.html
Copyright © 2020-2023  润新知