zoukankan      html  css  js  c++  java
  • Sphinx以及coreseek的安装及使用 .No1

    检索结构
    php -> sphinx -> mysql
    非结构化数据又叫全文数据,非固定长度字段例如文章标题搜索这类适用sphinx

    全文数据搜索:
    顺序扫描 : 如like查找
    索引扫描 : 把非结构化数据中的内容提取出来一部分重新组织,这部分数据就叫做索引

    全文检索分为两个过程
    1.创建索引
    2.搜索索引

    创建索引:
    sphinx通过语言处理组件会把搜索语句中的标点符号,语气助词给过滤掉,然后处理完毕后会
    分析出一些词语,传给索引组件,然后排序去除重复词语.

    搜索索引:
    搜索关键字 提交 -> sphinx 分析出文档ID -> mysql通过ID查询数据并返回


    中文分词需要coreseek
    coreseek 支持中文的全文检索引擎

    sphinx的安装
    下载源码包 进行源码安装
    ./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
    make && make install

    sphinx 中重要的三个命令(bin目录下)
    Indexer 创建索引命令
    Searchd 启动进程命令
    Search 命令行搜索命令

    配置sphinx
    cd /usr/local/sphinx/etc
    cp sphinx.conf.dist sphinx.conf
    vi sphinx.conf

    配置文件
    名为main的主数据源:source main{}
    继承名为main的增量数据源:source delta:main{}
    名为main的主索引:index main{}
    继承名为main的增量索引:index delta:main{}
    分布式索引:index dist1{}
    索引器:indexer{}
    服务进程:searchd{}

    修改配置文件中主数据源的mysql配置,测试环境的数据源名为main,假设mysql中test有张表叫post
    source main
    {
    # data source type. mandatory, no default value
    # known types are mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc
    type = mysql

    #####################################################################
    ## SQL settings (for 'mysql' and 'pgsql' types)
    #####################################################################

    # some straightforward parameters for SQL source types
    sql_host = localhost
    sql_user = root
    sql_pass = admin
    sql_db = test
    sql_port = 3306 # optional, default is 3306


    sql_sock = /tmp/mysqld.sock #如果是linux下需要开启,指定sock文件

    sql_query_pre = SET NAMES utf8
    sql_query_pre = SET SESSION query_cache_type=OFF #关闭缓存


    # main document fetch query
    # mandatory, integer document ID field MUST be the first selected column
    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


    }
    注释掉所有增量数据源,修改主索引

    index main
    {
    source = main

    # index files path and file name, without extension
    # mandatory, path must be writable, extensions will be auto-appended
    path = /usr/local/sphinx/var/data/main

    docinfo = extern
    mlock = 0
    morphology = none
    # default is 1 (index everything)
    min_word_len = 1

    # charset encoding type
    # optional, default is 'sbcs'
    # known types are 'sbcs' (Single Byte CharSet) and 'utf-8'
    charset_type = utf-8
    # 'utf-8' default value is
    # charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F

    }

    注释掉所有的增量索引和分布式索引

    配置完成后,创建索引
    命令 indexer
    -c 指定配置文件
    --all 对所有索引重新编制索引
    --rotate 用于轮换索引,主要是在不停止服务的时候,增加索引
    --merge 合并索引
    /usr/local/sphinx/sbin/indexer -c
    /usr/local/sphinx/etc/sphinx --all
    如果报错./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
    解决方式:cp /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18

    测试
    建立索引
    [root@localhost bin]# ./indexer --all
    Sphinx 0.9.9-release (r2117)
    Copyright (c) 2001-2009, Andrew Aksyonoff

    using config file '/usr/local/sphinx/etc/sphinx.conf'...
    indexing index 'main'...
    collected 2 docs, 0.0 MB
    sorted 0.0 Mhits, 100.0% done
    total 2 docs, 47 bytes
    total 0.033 sec, 1414 bytes/sec, 60.21 docs/sec
    total 1 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
    total 5 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

    搜索
    [root@localhost bin]# ./search linux1
    Sphinx 0.9.9-release (r2117)
    Copyright (c) 2001-2009, Andrew Aksyonoff

    using config file '/usr/local/sphinx/etc/sphinx.conf'...
    index 'main': query 'linux1 ': returned 1 matches of 1 total in 0.000 sec

    displaying matches:
    1. document=1, weight=1
    id=1
    title=linux1
    content=salflsdkjsdglds

    words:
    1. 'linux1': 1 documents, 1 hits

    sphinx相当于把数据库数据索引静态化到本地 来加快查询速度 避免消耗数据库,给数据库给降压,当数据更新的时候,需要重新indexer --all 或者用 indexer main重建所有索引 才会搜出新的数据

    安装CORESEEK
    coreseek里有2个文件夹 一个是mmseg中文分词包 还有一个是csft(其实就是sphinx)包 都要安装

    首先安装mmseg中文分词
    ./configure --prefix=/usr/local/mmseg
    编译时可能会报错config.status: error: cannot find input file: src/Makefile.in
    通过automake来解决
    首先检查是否安装了libtool如果没有
    yum -y install libtool
    automake
    如果automake报错 原因可能是下列
    Libtool library used but `LIBTOOL' is undefined
    The usual way to define `LIBTOOL' is to add `AC_PROG_LIBTOOL'
    to `configure.ac' and run `aclocal' and `autoconf' again.
    If `AC_PROG_LIBTOOL' is in `configure.ac', make sure
    its definition is in aclocal's search path.

    原因分析
    aclocal是个扫描程序, 负责扫描configure.ac中所有的宏定义并展开,
    上面产生的原因就是找不到LIBTOOL宏的定义之处造成的.原因就是aclocal与libtool没有安装在一个相同目录下面aclocal是去默认 安装目录 /usr/share/aclocal下面搜索所有的.m4文件找所定义的宏,但是由于安装了多个aclocal,可能aclocal目录不存在,实际目录为/usr/share/aclocal1.10等,
    这就造成了aclocal找不到m4文件的情况, 解决办法就是将文件夹aclocal1.10重命名为aclocal.或者显示指定路径 aclocal -I /usr/share/aclocal1.10 -I /usr/share/libtool/m4 --install 或者把/usr/share/libtool/m4下面的文件都copy至/usr/share/aclocal1.10中.
    本人的机器上是/usr/share/下有2个文件夹 一个是aclocal,一个是aclocal-1.11,首先将aclocal的所有文件拷贝到aclocal-1.11下
    cp -R /user/share/aclocal/* /usr/share/aclocal-1.11/

    然后重新运行aclocal和autoconf
    aclocal && autoconf
    最后再次运行automake
    automake

    然后继续mmseg的安装
    ./configure --prefix=/usr/local/mmseg
    make && make install

    如果make 报错
    There is an easy fix when you get such messages as "X--tag=CXX: command not found".
    Just type:
    export echo=echo
    And try again.

    所以输入
    export echo=echo
    然后再次运行安装
    make && make install


    安装csft
    ./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
    安装完毕后 注意 coreseek 中的配置文件也是csft.conf 而不是 sphinx.conf
    cd /usr/local/coreseek/etc
    cp sphinx.conf.dist csft.conf
    vim csft.conf

    有些配置改动如下其他配置内容如上文的sphinx.conf
    在索引源中注释掉txt
    index main{
    #stopwords = G:datastopwords.txt
    #wordforms =G:datawordforms.txt
    #exceptions =/data/exceptions.txt
    #charset_type = sbcs
    #添加下面2行 意思是把中文分词加入到配置文件中
    char_type = zh_cn.utf-8
    charset_dictpath =/usr/local/mmseg/etc/ #你安装mmseg的目录
    }

    保存配置
    建立索引
    cd /usr/local/coreseek/bin
    ./indexer --all
    ./search 中文词缀


    如何用php去使用sphinx
    Sphinx集成到php程序中有两种方式
    1.Sphinx php 模块(这次我们选择使用的方式)
    2.Sphinx api 类(位于coreseek源码包里的csft里的api文件夹里有一个sphinxapi.php,使用的时候包含这个php文件即可)

    我们要使用sphinx需要做以下几件事:
    1.首先要有数据
    2.建立sphinx配置文件
    3.生成索引
    4,启动searchd 服务进程,并开启端口9312
    5.用php客户程序去链接sphinx服务


    /usr/local/coreseek/bin/searchd
    启动进程命令 searchd
    -c 指定配置文件
    --stop 停止服务
    --pidfile 显示指定pid文件
    -p 指定端口(默认9312)
    注意:这里启动的服务是searchd

    使用php sphinx的模块
    下载 sphinx-1.1.0.tgz

    tar zvxf sphinx-1.1.0.tgz
    cd sphinx-1.1.0
    /usr/local/php/bin/phpize #用于生成一个configure的脚本
    进入coreseek源码包的csft/api/libsphinxclent 目录下执行configure
    ./configure
    make && make install
    进入sphinx-1.1.0.gzt的源码包目录下 执行configure用于生成so 的shpinx模块
    ./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-sphinx
    make && make install
    安装成功后会有提示
    Build complete.
    Don't forget to run 'make test'.

    Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ (这个目录是sphinx.so所在的目录)

    然后我们编辑php的ini文件 在extension中加入
    extension=sphinx.so

    然后重启nginx和php的服务
    最后打印一下phpinfo 查看sphinx是否开启成功
    如果成功开启 就可以使用php手册里的sphinx的方法和代码了

  • 相关阅读:
    Html.ActionLink 几种重载方式说明及例子
    2 python 文本特征提取 CountVectorizer, TfidfVectorizer
    模型调参---GridSearchCV
    1 NLP学习大纲
    pandas.dropna/isnull/fillna/astype的用法
    激活函数总结
    LeetCode--53 最大连续子序列(总结)
    LeetCode--44 通配符匹配
    LeetCode--Two_Sum
    css 背景图片自适应元素大小
  • 原文地址:https://www.cnblogs.com/lixiuran/p/3588806.html
Copyright © 2011-2022 走看看