zoukankan      html  css  js  c++  java
  • Coreseek + Sphinx + Mysql + PHP构建中文检索引擎

    安装前首先安装依赖的软件包

    yum install make gcc g++ gcc-c++ libtool autoconf automake imake  libxml2-devel expat-devel

    在Linux、BSD上安装Sphinx/Coreseek

    $ wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz

    将你下载的tar包解压,并进入coreseek 子目录:

    $ tar xzvf coreseek-3.2.14.tar.gz
    $ cd coreseek

    1、首先安装MMSeg:

    $ cd mmseg

    $ ./bootstrap

    $ ./configure --prefix=/usr/local/mmseg

    $ make

    $ make install

    遇到的问题:
    error: cannot find input file: src/Makefile.in
    或者遇到其他类似error错误时...

    解决方案:
    依次执行下面的命令,我运行'aclocal'时又出现了错误,解决方案请看下文描述
    $ yum -y install libtool

    $ aclocal

    $ libtoolize --force

    $ automake --add-missing

    $ autoconf

    $ autoheader

    $ make clean

    $ ./configure --prefix=/usr/local/mmseg

    $ make

    $ make install

    $ cd ../

    2、运行配置 程序:

    $ cd csft-4.1

    $ yum install mysql-devel libxml2-devel expat expat-devel   支持MySQL数据源

    $ /sh buildconf.sh

    $ ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql-includes=/alidata/server/mysql-5.6.21/include --with-mysql-libs=/alidata/server/mysql-5.6.21/lib

    configure程序有很多运行选项。完整的列表可以通过使用 --help 开关得到。最重要的如下:

    --prefix, 定义将Coreseek安装到何处;比如 --prefix=/usr/local/coreseek (以下全部示例都假定Coreseek安装在这个位置)
    --with-mysql, 当自动检测失败时,指出在那里能找到MySQL 头文件和库文件;
    --with-pgsql, 指出在那里能找到PostgreSQL头文件和库文件.
    --with-mmseg, 启用基于MMSeg的中文分词法,并指出在那里能找到MMSeg头文件和库文件.
    --with-python, 启用Python数据源支持. 需要预先安装Python2.6.
    编译源代码生成二进制程序:

    $ make

    出现undefined reference to `libiconv'的类似错误,可以按照如下方法处理:
    ##方法一:(Linux使用)
    ## 直接执行:export LIBS="-liconv"
    ##然后make clean,再次configure后,进行编译安装make && make install
    ## 方法二:
    ## 首先configure,然后vim src/makefile
    ## 在其中搜索lexpat,在其后加上 -liconv
    ## 修改后该行应该为:-lexpat -liconv -L/usr/local/lib
    ## 然后再次make && make install

    安装二进制程序到你设定的目录下: (类Unix操作系统下默认为 /usr/local/bin/ , 但是可以被 configure --prefix) 修改安装目录

    $ make install

    $ cd ../

    ##命令行测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)
    $ cd testpack
    $ cat var/test/test.xml #此时应该正确显示中文
    $ /usr/local/mmseg/bin/mmseg -d /usr/local/mmseg/etc var/test/test.xml

    ##中文分词测试,如果显示不正常,请检查当前环境下的locale和UTF-8中文字符显示设置
    $ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc src/t1.txt
    中文/x 分/x 词/x 测试/x
    中国人/x 上海市/x

    若发现错误
     error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory
    解决方式
    cd /etc
    ln -s /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2
    ldconfig

     
    $ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all  #coreseek中文全文检索测试

    ##以下为正常情况下的提示信息:
    Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)]
    Copyright (c) 2007-2010,
    Beijing Choice Software Technologies Inc (http://www.coreseek.com)

    出现/usr/local/coreseek/bin/indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory的类似错误,可以按照如下方法处理:
    ##方法一:
    ## vi /etc/ld.so.conf
    ## 将下面这句加到文件到尾部,并保存文件 /alidata/server/mysql-5.6.21/lib
    ## ldconfig
    ## 方法二:
    ## locate libmysqlclient #运行该命令找到关于libmysqlclient.so.18的文件
    ## ln -s /alidata/server/mysql-5.6.21/lib/libmysqlclient.so.18 /usr/bin/libmysqlclient.so.18

    $ /usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索
     

    下面开始sphinx与mysql的配置

    创建配置sphinx与mysql的配置文件

    # vi /usr/local/coreseek/etc/csft_mysql.conf

    数据表字段取值对应到Coreseek的索引中,其关系如下:
    
    数据库:
    SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, score, title, content FROM documents
    id     : 自增字段,表的主键,整数
    group_id   : 整数字段
    date_added : 整数字段,使用UNIX_TIMESTAMP可将datetime类型转换为整数的timestamp
    score    : 浮点数字段
    title    : 字符串字段
    content   : 文本字段
    
    业务分析:
    文档编号:id
    查询过滤:分组(group_id),时间(date_added),score
    全文检索:title、content
    
    Coreseek索引配置:
    id         :ID属性,必须提供,在SQL语句中字段名称不限
              对应SQL查询的第一个字段,系统自动使用,内部属性名为@id,不需要也不能在配置中设定
              使用SetFilter()过滤,或者使用SetIDRange()过滤;
              SphinxSE之中,使用filter或者minid, maxid过滤
    
    sql_attr_uint   :整数属性,以上group_id、date_added都可用此设置,使用SetFilter()过滤,
              或者使用SetFilterRange()过滤;
              SphinxSE之中,使用filter或者range过滤;
    
    sql_attr_float   :浮点数属性,以上score可用此设置,使用SetFilterFloatRange()进行范围过滤,
              SphinxSE之中,使用range过滤;
    
    sql_attr_timestamp:timestamp属性,整数,以上date_added可用此设置,可用SetFilter()过滤
              或者使用SetFilterRange()过滤;
              SphinxSE之中,使用filter或者range过滤
    
    sql_attr_str2ordinal:字符串序列属性,以上title可用此设置,仅用于根据该字段排序
              但是设置后,该属性不可用于过滤,也不会保存实际字符串内容,更不能全文检索
              搜索结果中,其对应的信息为整数,由系统计算出来的排序序列值
    
    全文检索字段   :全文检索字段,以上title、content等字符串或者文本的字段都可用此设置
              任何出现在SQL语句中,既不是ID属性,也没有使用“sql_attr_类型”设置的字段,都是全文字段,
              使用Query()搜索;
              SphinxSE之中,使用query的查询文本进行搜索
    
    其他更详细和丰富的类型,请前往中文手册了解。
    #MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
    #请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
    
    #源定义
    source main
    {
        type                    = mysql
    
        sql_host                = localhost
        sql_user                = didiphp
        sql_pass                = DotDeeMy365com
        sql_db                    = new_didi
        sql_port                = 3306
        sql_query_pre            = SET NAMES utf8
    
        sql_query                = SELECT id, brand_id, seller_id, UNIX_TIMESTAMP(create_time) AS create_time, name, sell_price, market_price, cost_price, store_nums, img, ad_img, content, keywords, description, search_words, visit, favorite, comments, sale, detail, postage, postage_add FROM mall_goods
                                                                  #sql_query第一列id需为整数
                                                                  #name、content作为字符串/文本字段,被全文索引
        sql_attr_uint            = brand_id           #从SQL读取到的值必须为整数
        sql_attr_timestamp        = create_time #从SQL读取到的值必须为整数,作为时间属性
    
        sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
        sql_query_info            = SELECT id, brand_id, seller_id, UNIX_TIMESTAMP(create_time) AS create_time, name, sell_price, market_price, cost_price, store_nums, img, ad_img, content, keywords, description, search_words, visit, favorite, comments, sale, detail, postage, postage_add FROM mall_goods WHERE id=$id #命令行查询时,从数据库读取原始数据信息
    }
    
    #index定义
    index main
    {
        source            = main             #对应的source名称
        path            = /usr/local/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
        docinfo            = extern
        mlock            = 0
        morphology        = none
        min_word_len        = 1
        html_strip                = 0
    
        #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
        charset_dictpath = /usr/local/mmseg/etc/ #BSD、Linux环境下设置,/符号结尾
        #charset_dictpath = etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/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
        pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
        log = /usr/local/coreseek/var/log/searchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
        query_log = /usr/local/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
        binlog_path =                                #关闭binlog日志
    }

    调用命令列表:

    启动后台服务(必须开启)

    # /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf

    如果报错
    WARNING: index 'mysql': preload: failed to open var/data/mysql.sph: No such file or directory; NOT SERVING
    FATAL: no valid indexes to serve
    解决
    新建立索引
    /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all

    更改
    mysql的问题 stock路径问题,需要在my.cnf更改 /var/lib/mysql/mysql.sock
    vim /etc/my.cnf
    #socket         = /tmp/mysql.sock
    socket          = /var/lib/mysql/mysql.sock

    防火墙问题  关闭防火墙

    启动
    /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all
    /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf

    保证跨机器访问,关闭防火墙
    service iptables stop

    执行索引(查询、测试前必须执行一次)

    # /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate

    执行增量索引

    # /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate

    合并索引

    # /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0

    (为了防止多个关键字指向同一个文档加上--merge-dst-range deleted 0 0)

    后台服务测试

    # /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft_mysql.conf  aaa

    关闭后台服务

    # /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop

    自动化命令:

    crontab -e

    */1 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate  

    */5 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0  

    30 1 * * *  /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate

    以下任务计划的意思是:每隔一分钟执行一遍增量索引,每五分钟执行一遍合并索引,每天1:30执行整体索引

     
    参考:
    http://www.coreseek.cn/products-install/install_on_bsd_linux/
     
    http://blog.csdn.net/e421083458/article/details/21529969
     
    http://www.yuansir-web.com/2013/03/21/sphinx-%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D-coreseekmmseg%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E5%92%8C%E7%A4%BA%E4%BE%8B/
     
    http://www.cnblogs.com/rhythmK/archive/2012/10/24/2736873.html
     
    http://blog.csdn.net/fafa211/article/details/8028921
     
    http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html
  • 相关阅读:
    hive函数总结
    python判断文件和目录是否存在
    python中的参数
    写hive db的两种方法
    python中argparse模块的使用
    python数据持久存储:pickle模块的使用
    python读文件
    mysql 将时间戳直接转换成日期时间
    shell日期的应用
    [转]SQL UNION 和 UNION ALL 操作符
  • 原文地址:https://www.cnblogs.com/luojianqun/p/5195411.html
Copyright © 2011-2022 走看看